C++笔试奇技淫巧

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值