仿函数
必须重载()运算符
1 | class Equal{ |
1. 预定义函数对象和函数适配器(bind2nd)
c/c++ 提供了很多定义好的函数对象,常见的几个 less
, greater
, plus
, equal_to
,这些都是二元函数
bind1st和bind2nd是将二元函数转换为一元函数,比如一个比较大小的函数是二元函数。 当在某些情况下我们想要固定第一个参数或者第二个参数时,就成了一元函数
bind2nd(equal_to<string>(),"aaa")
set<string> :: iterator find_it = find_if(set1.begin(),set1.end(),bind2nd(equal_to<string>(),"aaa"));
// 查找是否包含1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22int main(){
// c/c++ 提供了很多定义好的函数对象
// 常见的几个 less, greater , plus , equal_to
plus<string> strAdd;
string str = strAdd("aaa","bbb");
// cout << str.c_str() << endl; // aaabbb
set<string,greater<string>> set1;
set1.insert("aaa");
set1.insert("bbb");
set1.insert("ccc");
// 判断是不是包含 aaa
// 怎么写仿函数,一定要确定好你的仿函数的参数
// bind2nd 函数适配器, aaa 相当于 equal_to 中的 right
set<string> :: iterator find_it = find_if(set1.begin(),set1.end(),bind2nd(equal_to<string>(),"aaa"));
if(find_it!=set1.end()){
cout << "找到了" << (*find_it).c_str() << endl;
}
}
2.自定义仿函数(函数对象) 和 count_if
1 | class Equal{ |
打印结果:
1 | count = 3 |
3. foreach, transform
transform(vector1.begin(),vector1.end(),vector2.begin(),transform_print);
:修改for_each(vector2.begin(),vector2.end(),print);
:循环遍历元素
1 | void print(int number){ |
打印结果:
1 | 4 |
4. find, find_if
find(first, end, value);
:返回区间[first,end)中第一个值等于value的元素的位置。如果没有找到匹配元素,则返回end。(只能判断等于)find_if (begin, end, func)
:从begin开始 ,到end为止,返回第一个让 func这个函数返回true的iterator。(所有判断都可以)
1 | vector<int> vector1; |
打印结果:
1 | 包含 |
5. count,count_if
count(first, end, value);
:返回区间[first,end)中值等于value的元素的个数。(只能判断等于)count_if(begin, end, func)
:从begin开始 ,到end为止,返回让 func这个函数返回true的元素个数。(所有判断都可以)
1 | vector<int> vector1; |
打印结果:
1 | 等于2的个数:2 |
6. merge
merge(vector1.begin(),vector1.end(),vector2.begin(),vector2.end(),vector3.begin());
:合并元素
1 | class _merge{ |
打印结果:
1 | 1 |
7. sort
sort(vector1.begin(),vector1.end(),less<int>());
:按照从小到大的方式排序random_shuffle(vector1.begin(),vector1.end());
:打乱 vector1的顺序
1 | vector<int> vector1; |
8. copy,replace
copy(vector1.begin(),vector1.begin()+2,vector2.begin());
:将vector1的前两位拷贝到vector2中,从vector2的开始位置拷入。replace(vector1.begin(),vector1.end(),2,22);
:将vector1中等于2的值替换成22
1 | vector<int> vector1; |