这是find_if 的源码,first和last是迭代器的开始和结束位置,pred是自定义仿函数。方面对照
equal_to的源码部分,方面对照
#include
#include
#include
using namespace std;
int main(){
set<string ,less<string>> setVar;
setVar.insert("a");
setVar.insert("b");
setVar.insert("c");
for(set<string>::iterator it = setVar.begin(); it != setVar.end();it++) {
cout << *it << endl;
}
// find_if
//equal_to 比较用的 equal_to()需要两个参数进行比较,直接按下面这样写不行
//find_if(setVar.begin(), setVar.end(), equal_to());
set<string, less<string>::iterator> it =
//需要比较的内容没有,使用函数适配器
//find_if(setVar.begin(), setVar.end(), equal_to(""), "c"); 怎么写都不行
//可以对比上面的源码截图
//bind2nd:能够把c传到equal_to的y值那里
//之后把setVar.begin(), setVar.end()前面的开始到结束传到X值
//bind1st() 第一个参数适配过去
find_if(setVar.begin(), setVar.end(), bind2nd(equal_to<string>(),"c"));
if(it != setVar.end()){
cout < "找到了" << endl;
}
return 0;
}
这些函数都是能找到API文档的。
#include
#include
#include
using namespace std;
class __F{
public:
void operator()(int __first){
cout << "自定义一元谓词" << __fist << endl;
}
}
int main(){
vetctor<int> vectorVar;
vectorVar.insert(10);
vectorVar.insert(20);
vectorVar.insert(30);
vectorVar.insert(40);
vectorVar.insert(50);
for_each(vectorVar.begin(), vectorVar.end(),__F());
return 0;
}
#include
#include
#include
using namespace std;
class __unary_op{
public:
// 能否接收int 返回string呢?是不行的,因为源码里面已经定义好了类型
int operator()(const int __first){
cout << "自定义一元谓词" << __fist << endl;
return __first + 9; // 修改每个元素 + 9
}
}
int main(){
vetctor<int> vectorVar;
vectorVar.insert(10);
vectorVar.insert(20);
vectorVar.insert(30);
vectorVar.insert(40);
vectorVar.insert(50);
// 第一种 类似于rxjava map 变化操作符
// 迭代器 result == 参数三
transform(vectorVar.begin(),vectorVar.end(), vextorVar.begin(), __unary_op());
for (auto it = vectorVar.begin(); it != vectorVar.end(); it++) {
cout << "第一种方式:" << *it << endl;
}
// 第二种方式,其实就是接收的迭代器参数是重新创建
vector<int> vectorVarResult;
// 定义result 大小空间
vectorVarResult。resize(vectorVar.size());
transform(vectorVar.begin(),vectorVar.end(), vectorVarResult.begin(), __unary_op());
for (auto it = vectorVar.begin(); it != vectorVar.end(); it++) {
cout << "第一种方式:" << *it << endl;
}
return 0;
}
find:自己啥也没干,就是简单对find_if的封装
find_if:仿函数是自定义的,条件自己写。
#include
#include
#include
using namespace std;
class __pred{
public:
int number;
__pred(int number):number(number) {}
bool operator()(const int value){
return number == value;
}
}
int main(){
vetctor<int> vectorVar;
vectorVar.insert(10);
vectorVar.insert(20);
vectorVar.insert(30);
vectorVar.insert(40);
vectorVar.insert(50);
//find_if
/**
关键代码: while(__first != __last && !__pred(__first)) //自定义仿函数 返回值bool 传入int
++ __first; //迭代器挪动
return __first;
*/
auto it = find(vectorVar.begin(), vectorVar.end(), __pred(10));
//判断结果
if(it != vectorVar.end()) {}
return 0;
}
#include
#include
#include
using namespace std;
int main(){
vetctor<int> vectorVar;
vectorVar.push_back(1);
vectorVar.push_back(3);
vectorVar.push_back(2);
vectorVar.push_back(2);
vectorVar.push_back(4);
count(vectorVar.begin(),vectorVar.end(),2);// 统计2的个数
//count_if:仿函数是自定义的,条件自己写。
/**
跟上面的find和find_if类似
conut_if关键代码:
for(;__first != __last; ++first)
if(__pred(__first)) //满足条件则下面进行计数加1,注意:__first是迭代器类型
++__n;
return __n;
*/
return 0;
}
#include
#include
#include
using namespace std;
int main(){
vetctor<int> vectorVar;
vectorVar.push_back(1);
vectorVar.push_back(2);
vectorVar.push_back(3);
vectorVar.push_back(4);
vetctor<int> vectorVar2;
vectorVar2.push_back(5);
vectorVar2.push_back(6);
vectorVar2.push_back(7);
vectorVar2.push_back(8);
// 合并成一个result
vector<int> vectorResult;
vectorResult.resize(vectorVar.size() + vectorVar2.size());
// 源码引用的函数太多,不太适合在这里贴出。
merge(vectorVar.begin(),vectorVar.end(),vectorVar.begin(),
vectorVar2.end(),vectorReault.begin())
for(auto it = vectorResult.begin(); it != vectorResult.end(); it++) {
cout << *it << endl;
}
return 0;
}
#include
#include
#include
using namespace std;
int main(){
vetctor<int> vectorVar;
vectorVar.push_back(1);
vectorVar.push_back(2);
vectorVar.push_back(4);
vectorVar.push_back(3);
//源码查找最终找到关键代码: if (__comp(__i,__first))
// 自定义仿函数规则 返回值 bool 第一个参数int 第二个参数类型?
// 参考系统内置的仿函数 less() ,发现里面使用的是函数模板(泛型)
//这个实际上在我们定义的时候传入的类型是什么就决定是什么了
//如果你想跟系统一样匹配所有类型,那么定义成模板函数
sort(vectorVar.ebgin(),vectorVar.end(),less<int>());
for(auto it = vectorResult.begin(); it != vectorResult.end(); it++) {
cout << *it << endl;
}
return 0;
}
#include
#include
#include
using namespace std;
int main(){
vetctor<int> vectorVar;
vectorVar.push_back(1);
vectorVar.push_back(2);
vectorVar.push_back(3);
vectorVar.push_back(4);
// 随机打乱顺序
random_shuffle(vectorVar.ebgin(),vectorVar.end());
for(auto it = vectorVar.begin(); it != vectorVar.end(); it++) {
cout << *it << endl;
}
return 0;
}
#include
#include
#include
using namespace std;
int main(){
vetctor<int> vectorVar;
vectorVar.push_back(1);
vectorVar.push_back(2);
vectorVar.push_back(3);
vectorVar.push_back(4);
vector<int> vectorResult;
vectorResult.resize(vectorVar.size());
// 复制 这个api还是有点常用的
copy(vectorVar.ebgin(),vectorVar.end(),vectorResult.begin());
for(auto it = vectorResult.begin(); it != vectorResult.end(); it++) {
cout << *it << endl;
}
return 0;
}
#include
#include
#include
using namespace std;
int main(){
vetctor<int> vectorVar;
vectorVar.push_back(1);
vectorVar.push_back(2);
vectorVar.push_back(3);
vectorVar.push_back(4);
// 1~2 的范围内 把2替换成22
replace(vectorVar.ebgin(),vectorVar.begin()+ 2,2,22);
for(auto it = vectorVar.begin(); it != vectorVar.end(); it++) {
cout << *it << endl;
}
return 0;
}