项目中经常用到一些小函数(windows,ubuntu及安卓下通过测试)
目录:
1. std::string常用操作
- std::string 转 double
- double 转 std::string
- std::string 转 int
- int 转 std::string
- std::string 转大写
- 一个字符串是否包含另外一个字符串
- 字符串替换replace
- 字符串分割split
- 字符串去除空格trim
2. 文件IO操作相关(路径操作及文件操作)
path
- 给定文件是否存在
- 获得文件夹下所有文件的名字列表
- 获得文件夹下所有文件的路径列表
- 给定路径是否是文件夹
- 获得文件夹下的子文件夹列表
- 获得文件名(不带扩展)
文件
- 读取txt,按行读取
- 读取txt,全部读取
- 写入txt
3. STL操作
- vector最大值、最小值
- vector/map查找元素是否存在
- vector是否包含重复元素
- vector去除重复元素
- std::sort对结构体数组排序
- std::map/std::unordered_map使用
- Member functions Vs Algorithm functions
1. std::string常用操作
- std::string 转 double
- double 转 std::string
- std::string 转 int
- int 转 std::string
- std::string 转大写
- 一个字符串是否包含另外一个字符串
- 字符串替换replace
- 字符串分割split
- 字符串去除空格trim
std::string Double2String(double myDoubleVar) {
// The C++11 way:
//return std::to_string(myDoubleVar);
/*
//The C way:
char buffer[32];
snprintf(buffer, sizeof(buffer), "%g", myDoubleVar);
*/
//The C++03 way:
std::ostringstream sstream;
sstream << myDoubleVar;
return sstream.str();
}
std::string Double2String(double dbl, int num) {
std::ostringstream sstream;
sstream << std::setiosflags(std::ios::fixed) << std::setprecision(num) << dbl;
return sstream.str();
}
double String2Double(std::string str) {
//return std::stod(str);
return atof(str.c_str());
}
int String2int(std::string str) {
//return std::stoi(str);
return atoi(str.c_str());
}
std::string Int2Stirng(int iNum) {
/* c++ 11*/
//return std::to_string(iNum);
// method 2
std::ostringstream ss;
ss << iNum;
return ss.str();
}
bool bStr1ContainsStr2(std::string str1, std::string str2) {
return str1.find(str2) != std::string::npos;
}
std::string to_upper(std::string str) {
std::transform(str.begin(), str.end(), str.begin(), ::toupper);
return str;
}
std::string to_lower(std::string str) {
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
return str;
}
std::string ReplaceAll(std::string str, const std::string& from, const std::string& to) {
size_t start_pos = 0;
while ((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
}
return str;
}
字符串分割
std::vector<std::string> split(const std::string &s, char delim) {
std::stringstream ss(s);
std::string item;
std::vector<std::string> elems;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
2.文件操作相关(跨平台,没有使用windows only的)
- 给定文件是否存在
- 获得文件夹下所有文件的名字列表
- 获得文件夹下所有文件的路径列表
- 给定路径是否是文件夹
- 获得文件夹下的子文件夹列表
- 获得文件名(不带扩展)
- 读取txt,按行读取
- 读取txt,全部读取
- 写入txt
- 方法1: 使用c++14/17
#include <sstream>
#include <fstream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
//https://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c
//判断文件是否存在
bool is_file_exist(const std::string& name) {
//std::cout<<"is file exist"<<name<<std::endl;
std::ifstream infile(name.c_str());
return infile.good();
//bool b=fs::exists(name);
//return b;
}
/*http://www.martinbroadhurst.com/list-the-files-in-a-directory-in-c.html
* https://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
*/
//获得文件夹下的文件名列表
void GetFilesFromdirectory(const std::string& name, std::vector<std::string>& v)
{
for (auto& p : fs::directory_iterator(name)) {
v.push_back(p.path().filename().string());
}
}
//获得文件夹下的文件路径列表
void GetFilesPathsFromdirectory(const std::string& name, std::vector<std::string>& v)
{
for (auto& p : fs::directory_iterator(name)) {
v.push_back(p.path().string());
}
}
//是否是文件夹
bool is_folder(const char* dir_name) {
return fs::is_directory(dir_name);
}
//获得文件夹下的子文件夹列表
void GetSubDirectoryFromdirectory(const std::string& name, std::vector<std::string>& v)
{
for (auto& p : fs::directory_iterator(name)) {
if (fs::is_directory(p)) {
v.push_back(p.path().filename().string());
}
}
}
//获得文件名不带扩展名
std::string GetFilenameWithoutExtension(const std::string& fileName) {
std::size_t lastindex = fileName.find_last_of(".");
return fileName.substr(0, lastindex);
}
不使用c++14,使用“dirent.h”
/*http://www.martinbroadhurst.com/list-the-files-in-a-directory-in-c.html
* https://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
*/
void GetFilesFromdirectory(const std::string& name, std::vector<std::string>& v)
{
DIR* dirp = opendir(name.c_str());
if (dirp == nullptr)
{
std::cout << "INFO:" << name << "not exist" << std::endl;
return;
}
struct dirent* dp;
while ((dp = readdir(dirp)) != nullptr) {
v.push_back(dp->d_name);
}
closedir(dirp);
}
bool is_folder(const char* dir_name) {
auto dir = opendir(dir_name);
if (dir) {
closedir(dir);
return true;
}
return false;
}
void GetSubDirectoryFromdirectory(const std::string& name, std::vector<std::string>& v)
{
DIR* dirp = opendir(name.c_str());
if (dirp == nullptr)
{
std::cout << "INFO:" << name << "not exist" << std::endl;
return;
}
struct dirent* dp;
while ((dp = readdir(dirp)) != nullptr) {
if (dp->d_type & DT_DIR) {
if (std::string(dp->d_name) != "." && std::string(dp->d_name) != "..") {
v.push_back(dp->d_name);
}
}
}
closedir(dirp);
}
Txt I/O操作
标准库
#include <fstream>
ofstream //文件写操作 内存写入存储设备
ifstream //文件读操作,存储设备读区到内存中
fstream //读写操作,对打开的文件可进行读写操作
打开并建立文件的选项:
ios::in 读权限
ios::out 写权限
ios::truce 清空写
ios::app 追加写,不清空
ios::ate 和app相同(linux下)
ios::binary 二进制打开
#pragma once
#include <fstream>
#include <string>
#include <sstream>
class CTxtHelper {
public:
static void Write2Txt(std::string FileName,std::string strContant) {
std::fstream f(FileName, std::ios::out);
f << strContant << std::endl;
f.close();
}
static void Write2Txt(std::string FileName, std::vector<std::string> strAllines) {
std::fstream f(FileName, std::ios::out);
for (auto line : strAllines) {
f << line << std::endl;
}
f.close();
}
static std::string ReadFromTxt(std::string FileName) {
std::ifstream t(FileName);
std::stringstream buffer;
buffer << t.rdbuf();
std::string strJson(buffer.str());
t.close();
return strJson;
}
static bool ReadFromTxt(std::string FileName, std::vector<std::string> &Alllines) {
Alllines.clear();
std::ifstream file(FileName);
if (file.is_open()) {
std::string line;
while (getline(file, line)) {
Alllines.push_back(line);
}
file.close();
}
}
//void CreatTanksFromTxt(CDynamicINFO* Outdata, std::string filePath) {
// int bay;
// double lcg, tcg, vcg;
// int num;
// double weight;
// double width;
// std::ifstream infile(filePath);
// while (infile >> bay >> lcg >> tcg >> vcg >> num >> weight >> width) {
// auto tank = std::make_shared<CContainerHoldTank>();
// tank->dblCurrentWeight = weight;
// tank->dblCurrentLCG = lcg;
// tank->dblCurrentTCG = tcg;
// tank->dblCurrentVCG = vcg;
// tank->dblDistriAftX = lcg - width / 2.0;
// tank->dblDistriForeX = lcg + width / 2.0;
// Outdata->listShipAllTank.push_back(tank);
// }
//}
};
3. STL操作
- vector最大值、最小值
double MAXOFVECTOR(const std::vector<double> &vec) {
if (vec.size() == 0) return 0;
return *std::max_element(vec.begin(), vec.end());
}
double MINOFVECTOR(const std::vector<double>& vec) {
if (vec.size() == 0) return 0;
return *std::min_element(vec.begin(), vec.end());
}
double MINOFVECTOR(const std::vector<double>& vec, int* index) {
if(vec.size()>0) {
auto biggest = std::min_element(vec.begin(), vec.end());
*index = std::distance(std::begin(vec), biggest);
return *biggest;
}else {
*index = 0;
return 0;
}
}
double MAXOFVECTOR(const std::vector<double>& vec, int* index) {
if(vec.size()>0) {
auto biggest = std::max_element(vec.begin(), vec.end());
*index = std::distance(std::begin(vec), biggest);
return *biggest;
}else {
*index = 0;
return 0;
}
}
- vector/map查找元素是否存在
bool VectorContains(const std::vector<std::string>& v, std::string str)
{
if (std::find(v.begin(), v.end(), str) != v.end())
{
return true;
}
return false;
}
- vector是否包含重复元素
方法1:使用std::set
int removeDuplicates(vector<int>& nums) {
set<int> num;
for (int i = 0; i < nums.size(); i++) {
num.insert(nums[i]);
}
nums.assign(num.begin(), num.end());
return nums.size();
}
方法2:使用std::unique
int removeDuplicates2(vector<int>& nums) {
std::sort(nums.begin(), nums.end());
nums.erase(std::unique(begin(nums), end(nums)), nums.end());
return nums.size();
}
方法3:烧脑壳
int removeDuplicates3(vector<int>& nums) {
int len = 0, i = 0, j = 0;
while (i < nums.size() && j < nums.size()) {
nums[len++] = nums[i];
while (j < nums.size() && nums[i] == nums[j]) j++;
i = j;
}
return len;
}
- vector去除重复元素
方法1:使用std::set
int removeDuplicates(vector<int>& nums) {
set<int> num;
for (int i = 0; i < nums.size(); i++) {
num.insert(nums[i]);
}
nums.assign(num.begin(), num.end());
return nums.size();
}
方法2:使用std::unique
int removeDuplicates2(vector<int>& nums) {
std::sort(nums.begin(), nums.end());
nums.erase(std::unique(begin(nums), end(nums)), nums.end());
return nums.size();
}
方法3:烧脑壳
int removeDuplicates3(vector<int>& nums) {
int len = 0, i = 0, j = 0;
while (i < nums.size() && j < nums.size()) {
nums[len++] = nums[i];
while (j < nums.size() && nums[i] == nums[j]) j++;
i = j;
}
return len;
}
- std::sort对结构体数组排序
我经常使用std::sort对结构体配合Lammda匿名函数使用,比如点的数组按照x升序排列
class CPoint2D {
public:
CPoint2D(double x1,double y1) {
x = x1; y = y1;
}
double x;
double y;
};
int main(){
std::vector<CPoint2D> Pts{ {1,1},{3,3},{2,2} };
std::sort(begin(Pts), end(Pts), [](const CPoint2D& pt1, const CPoint2D& pt2) {
return pt1.x < pt2.x;
});
}
- std::map/std::unordered_map使用
std::map底层为红黑树,std::unordered_map底层为哈希表,我喜欢用std::unordered_map,感觉查找速度快(我没做过测试)
#include <iostream>
#include <unordered_map>
int main() {
//声明及初始化
std::unordered_map<std::string, int> uMap0;
std::unordered_map<std::string, int> uMap{ {"id1",1},{"id2",2} };
//插入
uMap.insert(std::make_pair("id3", 3));
uMap.insert(std::make_pair("id4", 4));
uMap.insert(std::pair < std::string, int>("id5", 5));
uMap["id6"] = 6;
//查找 find或count
if (uMap.find("id3") != uMap.end()) {
std::cout << "存在" << std::endl;
}
if (uMap.count("id2") == 1) {
std::cout << "存在" << std::endl;
}
//遍历 for或while
for (const auto& ele : uMap) {
std::cout << ele.first << " " << ele.second << std::endl;
}
auto iter = uMap.begin();
while (iter != uMap.end()) {
std::cout << iter->first << " " << iter->second << std::endl;
iter++;
}
//取值
uMap["id1"] = 1;
uMap.at("id2") = 2;
//删除
uMap.erase("id1"); //删除某元素
uMap.clear(); //清空所有
//判断字典是否为空empty/size
if (uMap.empty()) {
std::cout << "空" << std::endl;
}
if (uMap.size() == 0) {
std::cout << "空" << std::endl;
}
}
- Member functions Vs Algorithm functions
Summary:
There are duplicated functions between container's member functions and algorithm functions, Prefer member functions over algorithm functions with the same time
{
std::unordered_set<int> s = { 1,2,3,5,4,8,9 };
auto iter = s.find(4); //O(1)
auto iter1 = std::find(s.begin(), s.end(), 4); //O(n)
}
//list
{
std::list<int> s = { 2,1,3,8,5,9 };
s.remove(3);
//s:{2,1,8,5,9}
auto iter1 = std::remove(s.begin(), s.end(), 3);
//s:{2,1,8,5,9,9}
s.erase(iter1, s.end());
//s:{}
}
待续...
参考:
- c++ code snippets
2. c++ 读写文件操作
3. co library
idealvin:C++ 基础库 CO 参考文档zhuanlan.zhihu.com4. c++ 17 <filesystem>
C++17 filesystem 文件系统(详解)blog.csdn.netSTL算法
Nonmodifying
ajf adjacent_find
alo all_of
ano any_of
cni count_if
cnt count
eql equal
ffo find_first_of
fin find_if_not
fnd find
fne find_end
fni find_if
fre for_each
ihp is_heap
ihu is_heap_until
ipr is_permutation
ipt is_partitioned
iss is_sorted
isu is_sorted_until
lxc lexigraphical_compare
mme minmax_element
mne min_element
msm mismatch
mxe max_element
nno none_of
ppt partition_point
srh search
srn search_n
Sorting
mkh make_heap
nth nth_element
phh push_heap
pph pop_heap
psc partial_sort_copy
pst partial_sort
ptc partition_copy
ptn partition
spt stable_partition
srt sort
sth sort_heap
sts stable_sort
Sorted Ranges
bns binary_search
eqr equal_range
erl equal_range
inc includes
ipm inplace_merge
lwb lower_bound
mrg merge
ssd set_symmetric_difference
std set_difference
stn set_intersection
stu set_union
ucp unique_copy
upb upper_bound
Modifying
cpb copy_backward
cpi copy_if
cpn copy_n
cpy copy
fil fill
fln fill_n
gnn generate_n
gnr generate
ita iota
mov move
mvb move_backward
rci replace_copy_if
rpc replace_copy
rpi replace_if
rpl replace
swp swap
swr swap_ranges
tfm transform
Removing
rmc remove_copy
rmf remove_copy_if
rmi remove_if
rmv remove
uqe unique
Mutating
nxp next_permutation
prp prev_permutation
rtc rotate_copy
rte rotate
rvc reverse_copy
rvr reverse
shf random_shuffle
Numeric
acl accumulate
acm accumulate
Idioms
erm erase
Strings
ltr string_trim_left
lwr string_lower
trm string_trim_right
upr string_upper
Streams
oit copy
sti cin
sto cout
Containers
stv vector