C++中一些有用的小函数总结
前言
在刷Leetcode的过程中,发现使用一些小函数,能够大幅度提高coding效率,现总结如下。
一、计算类
1. accumulate
累加函数。括号中第一个参数为vector的起始地址,第二个为结束地址,第三个为初始值。
int sum = accumulate(vec.begin(), vec.end(), 1);
该函数的头文件在numeric中。
2. count
统计函数。括号中第一个参数为vector的起始地址,第二个为结束地址,第三个为需要统计的值。
int ct = count(vec.begin(), vec.end(), 1);
该函数的头文件在algorithm中。
3. log10
对数函数。括号中参数为以10为底的对数。通过该函数可以表示以任何数为底数的对数函数,比如以3为底的对数函数如下所示:
int value = log10(27) / log10(3);
该函数的头文件在cmath中。
4. fmod
针对double的取余函数。括号中第一个参数为被除数,第二个参数为除数。这个函数可以用来判断一个数是不是正整数,如下所示:
fmod(21,1) == 0 ?
该函数的头文件在math.h中。
5. sqrt
开根号函数,如下所示:
sqrt(100)
该函数的头文件在math.h中。
6. iota
让vector里面的元素从小到大赋值,如下所示:
vector<int> a(4, 0);
iota(a.begin(), a.end(), 10); // 从10开始赋值
for (int i: a) cout << i << endl;
// 输出
// 10
// 11
// 12
// 13
7. vector求前缀和
vector<int> a{1, 3, 6}, b(3);
partial_sum(a.begin(), a.end(), b.begin());
for (int i: b) cout << i << endl;
// 输出
// 1
// 4
// 10
8.截取vector
以截取前2个和后两个为例:
vector<int> a{-10, -8, 0, 8, 10};
vector<int> f2(a.begin(), a.begin() + 2);
vector<int> r2(a.end() - 2, a.end());
// f2 = {-10, 8}
// r2 = {8, 10}
二、转换类
to_string
将其他类型的值转换成string
int a = 99;
string b = to_string(a);
二、查找类
find
在一个string中查找有没有某char或者string
string a = "abcd";
string fb = "b";
char fc = 'c';
char fn = 'n';
string::size_type idx;
idx = a.find(fb);
cout << idx << endl; // 输出1
idx = a.find(fc);
cout << idx << endl; // 输出2
idx = a.find(fn); // 此时 idx == string::npos
三、排序类
sort
以对vector排序为例,比如我们定义按vector第3位,从小到大排序,那么需要先定义如下的比较函数:
bool comp (vector<int> a, vector<int> b) {
return a[2] < b[2];
}
然后再在主函数中进行调用,格式如下:
vector<vector<int>> a{{0, 2, 5, 3}, {5, 9, 3, 1}, {0, 10, 7}};
sort(a.begin(), a.end(), comp);
for_each(a.begin(), a.end(), [](vector<int> x){
for (int i = 0; i < x.size(); ++i) {
cout << x[i] << " ";
}
cout << endl;
});
得到输出结果如下:
5 9 3 1
0 2 5 3
0 10 7
其实不知对于vector,对于其他数据类型,只要定义好comp,就可以进行相应的排序。
三、判断类
isalpha isspace isdigit ispunct
char a = 'b';
isalpha(a); // 返回非0值
isspace(a); // 返回0
isdigit(a); // 返回0
ispunct(a); // 返回0
四、输出类
setprecision
double a = 1.2345;
cout << setprecision(2) << fixed << a; // 输出1.23,保留了2位小数
五.字符串比较
char s1[] = "abc", s2[] = "abd";
cout << strcmp(s1, s2);
char* s3 = "ab", *s4 = "aa";
cout << strcmp(s3, s4);