C++笔试奇技淫巧
next_permutation用于全排列
vector<int> a {2,2,1};
sort(a.begin(),a.end());
do{
for (int i:a)
cout<<i<<" ";
cout<<endl;
} while(next_permutation(a.begin(),a.end()));
lower_bound和upper_bound用于二分查找(equal_range)
find()、find_if()、search() 这些函数的底层实现都采用的是顺序查找(逐个遍历)的方式,在某些场景中的执行效率并不高。例如,当指定区域内的数据处于有序状态时,如果想查找某个目标元素,更推荐使用二分查找的方法(相比顺序查找,二分查找的执行效率更高)。
幸运的是,除了前面讲过的几个函数外,C++ STL标准库中还提供有 lower_bound()、upper_bound()、equal_range() 以及 binary_search() 这 4 个查找函数,它们的底层实现采用的都是二分查找的方式。
二分查找的函数有 3 个:
lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个 出现的位置。
upper_bound(起始地址,结束地址,要查找的数值) 返回的是 第一个大于待查找数值 出现的位置。
binary_search(起始地址,结束地址,要查找的数值) 返回的是是否存在这么一个数,是一个bool值。
vector<int> a {1,2,3,4,5,5,5,6,7};
auto lower = lower_bound(a.begin(),a.end(),5);
auto upper = upper_bound(a.begin(),a.end(),5);
cout<<"lower = "<<*lower<<endl;//第一个5
cout<<"upper = "<<*upper<<endl;//输入6
qual_range 返回范围[first,last)内等于指定值val的子范围的迭代器。
注意的是使用这个函数的前提是范围[first,last)内的元素是有序的。
同时注意函数的返回值类型,返回值是个pair对象,pair的first是左边界的迭代器,pair的second是右边界的迭代器。区间是左闭右开的,[左边界,右边界)。
vector<int> a {1,2,3,4,5,5,5,6,7};
auto b = equal_range(a.begin(), a.end(),5);
cout<<"lower = "<<*b.first<<endl;//第一个5
cout<<"upper = "<<*b.second<<endl;//输入6
regex用于字符串匹配
参考:C++正则表达式
使用regex需要包含头文件#include <regex>
1) regex_match用于完全匹配:
string txt = "abbcd";
string pat = "a.*c";
regex reg(pat);
bool ret = regex_match(txt, reg);//false
bool ret2 = regex_match(txt.begin(), txt.end() - 1, reg);//true
2) regex_search用于查找模式串在文本串的第一个最长子串
string txt = "012abbcdefacab";
string pat = "ab*c";
regex reg(pat);
smatch result;//smatch对应string,cmatch对应字符串
regex_search(txt, result,reg);
cout << "match substr: " << result[0] << endl;//match substr: abbc
cout << "prefix: " << result.prefix() << endl;//prefix: 012
cout << "suffix: " << result.suffix() << endl;//suffix: defacab
查找字符串中每一个最长满足模式串的子串
string txt = "012abbcdefacab";
string pat = "ab*c";
regex reg(pat);
smatch result;
for (auto pos = txt.cbegin(), end = txt.cend(); regex_search(pos, end, result, reg); pos = result.suffix().first) {
cout << "match substr: " << result[0] << endl;
cout << "prefix: " << result.prefix() << endl;
cout << "suffix: " << result.suffix() << endl;
cout << "--------------------------- " <<endl;
}
3) regex_token_iterator以模式串分割文本串
string txt = "abc,dic,dji,1234,dj";
string pat = ",";
regex reg(pat);
sregex_token_iterator pos(txt.begin(),txt.end(), reg,-1);//关键一定要有-1
decltype(pos) end;
for (; pos != end; pos++)
cout << pos->str() << endl;
4) regex_replace替换字符串
string txt ="abc,dic,dji,1234,dj";
string pat = "c,";
regex reg(pat);
auto res = regex_replace(txt, reg, "gg");
cout << res << endl;//abggdiggdji,1234,dj