c++ 的sort函数
#include
主要对数组(int a[]或者vector数组)进行排序
v.begin()和v.end()表示头尾
int a[]表示数组的首地址 a[]+n表示尾部
sort(),若没有传入cmp参数,默认表示v从小到大进行排列
sort(v.begin(), v.end());// 因为这⾥没有传⼊参数cmp,所以按照默认,v从⼩到⼤排列 sort(arr, arr + 10, cmp); // arr从⼤到⼩排列,因为cmp函数排序规则设置了从⼤到⼩
sort自定义cmp函数
#includeusing namespace std; struct stu { // 定义⼀个结构体stu,number表示学号,score表示分数 int number; int score; } bool cmp(stu a, stu b) { // cmp函数,返回值是bool,传⼊的参数类型应该是结构体stu类型 if (a.score != b.score) // 如果学⽣分数不同,就按照分数从⼤到⼩排列 return a.score > b.score; else // 如果学⽣分数相同,就按照学号从⼩到⼤排列 return a.number < b.number; } // 有时候这种简单的if-else语句我喜欢直接⽤⼀个C语⾔⾥⾯的三⽬运算符表示~ bool cmp(stu a, stu b) { return a.score != b.score ? a.score > b.score : a.number < b.number;
!注意!
sort函数的cmp只能是>或者<
判断这些字符是否字母、数字、小写字母、大写字母等
#include#include using namespace std; int main(){ char c; cin>>c; if(isalpha(c) {cout<<"c is alpha" } return 0;} isalpha 字⺟(包括⼤写、⼩写) islower (⼩写字⺟) isupper (⼤写字⺟) isalnum (字⺟⼤写⼩写+数字) isblank (space和 t ) isspace ( space 、 t 、 r 、 n )
cctype 中除了上⾯所说的⽤来判断某个字符是否是某种类型,还有两个经常⽤到的函数: tolower
和 toupper
char c = 'A'; char t = tolower(c); // 将c字符转化为⼩写字符赋值给t,如果c本身就是⼩写字符也没有关系~ cout << t; // 此处t为'a'
auto声明
当然这个在算法⾥⾯最主要的⽤处不是这个,⽽是在STL中使⽤迭代器的时候, auto 可以代替⼀⼤⻓
串的迭代器类型声明:
// 本来set的迭代器遍历要这样写: for(set::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } // 现在可以直接替换成这样的写法: for(auto it = s.begin(); it != s.end(); it++) { cout << *it << " "; }
基于范围的for循环
除了像C语⾔的for语句 for (i = 0; i < arr.size(); i++) 这样,C++11标准还为C++添加了⼀种新的 for 循环⽅
式,叫做基于范围(range-based)的for循环,这在遍历数组中的每⼀个元素时使⽤会⽐较简便~⽐如
想要输出数组 arr 中的每⼀个值,可以使⽤如下的⽅式输出:
int arr[4] = {0, 1, 2, 3};
for (int i : arr)
cout << i << endl; // 输出数组中的每⼀个元素的值,每个元素占据⼀⾏
i变量从数组的第⼀个元素开始,不断执⾏循环, i 依次表示数组中的每⼀个元素~注意,使⽤ int
i 的⽅式定义时,该语句只能⽤来输出数组中元素的值,⽽不能修改数组中的元素,如果想要修改,
必须使⽤ int &i 这种定义引⽤变量的⽅式~⽐如想给数组中的每⼀个元素都乘以 2 ,可以使⽤如下⽅
式:
int arr[4] = {0, 1, 2, 3};
for (int &i : arr) // i为引⽤变量
i = i * 2; // 将数组中的每⼀个元素都乘以2,arr[4]的内容变为了{0, 2, 4, 6}
to_string用法
#include
#include#include using namespace std; int main() { string s1 = to_string(123); // 将123这个数字转成字符串 cout << s1 << endl; string s2 = to_string(4.5); // 将4.5这个数字转成字符串 cout << s2 << endl; cout << s1 + s2 << endl; // 将s1和s2两个字符串拼接起来并输出 printf("%sn", (s1 + s2).c_str()); // 如果想⽤printf输出string,得加⼀ 个.c_str() return 0; }
stoi、stod的用法
使⽤ stoi 、 stod 可以将字符串 string 转化为对应的 int 型、 double 型变量
#include#include using namespace std; int main() { string str = "123"; int a = stoi(str); cout << a; str = "123.44"; double b = stod(str); cout << b; return 0; } stof (string to float) stold (string to long double) stol (string to long) stoll (string to long long) stoul (string to unsigned long) stoull (string to unsigned long long)
位运算bitset
#include#include using namespace std; int main() { bitset<5> b("11"); //5表示5个⼆进位 // 初始化⽅式: // bitset<5> b; 都为0 // bitset<5> b(u); u为unsigned int,如果u = 1,则输出b的结果为00001 // bitset<8> b(s); s为字符串,如"1101",则输出b的结果为00001101,在前⾯补0 // bitset<5> b(s, pos, n); 从字符串的s[pos]开始,n位⻓度 // 注意,bitset相当于⼀个数组,但是它是从⼆进制的低位到⾼位分别为b[0]、b[1]……的 // 所以按照b[i]⽅式逐位输出和直接输出b结果是相反的 cout << b << endl; // 如果bitset<5> b("11"); 则此处输出00011(即正常⼆进制顺序) for(int i = 0; i < 5; i++) cout << b[i]; // 如果bitset<5> b("11"); 则此处输出11000(即正常⼆进制顺序的倒 序) cout << endl << b.any(); //b中是否存在1的⼆进制位 cout << endl << b.none(); //b中不存在1吗? cout << endl << b.count(); //b中1的⼆进制位的个数 cout << endl << b.size(); //b中⼆进制位的个数 cout << endl << b.test(2); //测试下标为2处是否⼆进制位为1 b.set(4); //把b的下标为4处置1 b.reset(); //所有位归零 b.reset(3); //b的下标3处归零 b.flip(); //b的所有⼆进制位逐位取反 unsigned long a = b.to_ulong(); //b转换为unsigned long类型 return 0; }



