/* adjacent_find 查找两个相邻的等价元素*/
#include <iostream> #include <algorithm> #include <vector> using namespace std; /* adjacent_find 查找两个相邻的等价元素*/ bool myfunction(int i , int j) { return (i == j); } void adjacentFineFunction() { int myints[] = {5,5,51,30,30,20,10,10,20}; vector<int> myvector (myints,myints+8); vector<int> ::iterator it; //using default comparison it = adjacent_find(myvector.begin(), myvector.end()); if (it != myvector.end()) cout<<"the first pair of repeated elements are : "<<*it <<endl; //using predicate comparison: it = adjacent_find(++it, myvector.end(), myfunction); if (it != myvector.end()) { cout<<"the second pair of repeated elements are: "<<*it <<endl; } } /*all_of 检测在给定范围中是否所有元素都满足给定的条件*/ int main(int argc, const char * argv[]) { /*adjacent_find 查找两个相邻的等价元素*/ adjacentFineFunction(); return 0; }
输出结果
the first pair of repeated elements are : 5 the second pair of repeated elements are: 30
/*all_of 检测在给定范围中是否所有元素都满足给定的条件*/
#include <iostream> #include <algorithm> #include <array> using namespace std; /*all_of 检测在给定范围中是否所有元素都满足给定的条件*/ int main(int argc, const char * argv[]) { array<int, 8> foo = {3,5,7,11,13,17,19,13}; if (all_of(foo.begin(), foo.end(), [](int i){ return i % 2;})) { cout <<"All the elements are odd numbers"<<endl; } return 0; }
输出结果
All the elements are odd numbers
/*any_of 检测在给定范围中是否存在元素满足给定条件*/
#include <iostream> #include <algorithm> #include <array> using namespace std; /*any_of 检测在给定范围中是否存在元素满足给定条件*/ int main(int argc, const char * argv[]) { array<int, 7> foo = {0,1,-1,3,-3,5,-5}; if (any_of(foo.begin(), foo.end(), [](int i){return i< 0;})) { cout<<"There are negative elements in the range."<<endl; } return 0; }
输出结果:
There are negative elements in the range.
/*count 返回值等价于给定值的元素的个数*/
#include <iostream> #include <algorithm> #include <vector> using namespace std; /*count 返回值等价于给定值的元素的个数*/ int main(int argc, const char * argv[]) { int myints[] = {10,20,30,30,20,10,10,20}; //8 elements int mycount = (int)count(myints, myints + 8, 10); cout<< "10 appears " <<mycount<<" times."<<endl; //counting elements in container: vector<int> myvector(myints,myints + 8); mycount = (int)count(myvector.begin(), myvector.end(), 20); cout<< "20 appears " << mycount <<" times."<<endl; return 0; }
输出结果:
10 appears 3 times. 20 appears 3 times.
/*count_if 返回值满足给定条件的元素的个数*/
/*count_if 返回值满足给定条件的元素的个数*/ #include <iostream> //std::count #include <algorithm> //std::count_if #include <vector> //std::vector using namespace std; bool IsOdd(int i){return ((i % 2) == 1);} int main(int argc, const char * argv[]) { vector<int> myvector; for (int i = 1; i < 10; i++) { myvector.push_back(i); // myvector : 1 2 3 4 5 6 7 8 9 } int mycount = (int)count_if(myvector.begin(), myvector.end(), IsOdd); cout<<"myvector contains "<<mycount << "odd values."<<endl; return 0; }
输出结果:
myvector contains 5odd values.
/*equal 返回两个范围是否相等*/
/*equal 返回两个范围是否相等*/ #include <iostream> #include <algorithm> #include <vector> using namespace std; bool mypredicate(int i, int j) { return (i == j); } int main(int argc, const char * argv[]) { int myints[] = {20,40,60,80,100}; vector<int> myvector(myints , myints + 5); //using default comparison: if (equal(myvector.begin(), myvector.end(), myints)) { cout <<"The contents of both sequences are equal."<<endl; } else{ cout<<"The contents of both sequences differ."<<endl; } return 0; }
输出结果:
The contents of both sequences are equal.
/*find 返回第一个值等价于给定值得元素*/
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main(int argc, const char * argv[]) { int myints[] ={ 10, 20, 30 ,40 }; int* p; p = find(myints, myints + 4, 30); ++p; cout<<"The element following 30 is " <<*p<<endl; vector<int> myvector(myints,myints + 4); vector<int>::iterator it; it = find(myvector.begin(), myvector.end(), 30); ++it; cout<<"The element following 30 is " << *it <<endl; return 0; }
The element following 30 is 40 The element following 30 is 40
/*find_end 查找范围 A 中与范围 B等价的子范围最后出现的位置*/
#include <iostream> #include <algorithm> #include <vector> using namespace std; bool myfunction(int i,int j) { return (i == j); } int main(int argc, const char * argv[]) { int myints[] = {1,2,3,4,5,1,2,3,4,5}; vector<int> haystack(myints,myints + 10); int needle1[] = {2,3,4}; //using default comparison: vector<int>::iterator it; it = find_end(haystack.begin(), haystack.end(), needle1, needle1 + 3); if (it != haystack.end()) cout<< "needle1 last found at position " <<(it - haystack.begin())<<endl; int needle2[] = {5,1,2}; //using predicate comparison it = find_end(haystack.begin(), haystack.end(), needle2, needle2 + 3, myfunction); if (it != haystack.end()) cout<<"needle2 last found at position " <<(it - haystack.begin()) <<endl; return 0; }
结构输出:
needle1 last found at position 6 needle2 last found at position 4
/*find_first_of 查找范围 A 中第一个与范围 B 中任一元素等价的元素的位置*/
#include <iostream> #include <algorithm> #include <vector> #include <cctype> using namespace std; bool comp_case_insensitive(char c1,char c2){ return (tolower(c1) == tolower(c2)); } int main(int argc, const char * argv[]) { int mychars[] = {‘M‘,‘b‘,‘c‘,‘B‘,‘N‘,‘C‘}; vector<char> haystack(mychars,mychars + 6); vector<char>::iterator it; int needle[] = {‘B‘,‘9‘,‘C‘}; //using default comparison: it = find_first_of(haystack.begin(), haystack.end(), needle, needle + 3); if (it != haystack.end()) cout<<"The first match is: " << *it<<endl; //using predicate comparison it = find_first_of(haystack.begin(), haystack.end(), needle, needle + 3, comp_case_insensitive); if (it != haystack.end()) cout<<"The first match is: " <<*it<<endl; return 0; }
/*for_each 对范围中的每个元素调用指定函数*/
#include <iostream> #include <algorithm> #include <vector> using namespace std; void myfunction(int i){ cout<<" " <<i; } struct myclass { void operator() (int i){cout<<" " <<i;} }myobject; int main(int argc, const char * argv[]) { vector<int> myvector; myvector.push_back(10); myvector.push_back(20); myvector.push_back(30); cout<<"myvector contains: "; for_each(myvector.begin(), myvector.end(), myfunction); cout<<endl; cout<<"myvector contains: "; for_each(myvector.begin(), myvector.end(), myobject); cout<<endl; return 0; }
/*mismatch 返回两个范围中第一个元素不等价的位置*/
#include <iostream> #include <algorithm> #include <vector> #include <utility> using namespace std; bool mypredicate(int i ,int j){ return (i == j); } int main(int argc, const char * argv[]) { vector<int> myvector; for (int i = 1; i < 6; i++) myvector.push_back(i * 10); int myints[] = {10,20,80,320,1024}; pair<vector<int>::iterator, int*> mypair; //using default xomparison: mypair = mismatch(myvector.begin(), myvector.end(), myints); cout<<"First mismatching elements: "<<*mypair.first; cout<< " and " <<*mypair.second<<endl; ++mypair.first;++mypair.second; //using predicate comparison: mypair = mismatch(mypair.first, myvector.end(), mypair.second, mypredicate); cout<<"Second mismatching elements: " << *mypair.first <<" and "<<*mypair.second<<endl; return 0; }
/*none_of 检测在给定范围中是否不存在元素满足给定的条件*/
#include <iostream> #include <algorithm> #include <array> using namespace std; int main(int argc, const char * argv[]) { array<int, 8> foo = {1,2,4,8,16,32,64,128}; if (none_of(foo.begin(), foo.end(), [](int i){return i < 60;})) { cout<<"There are no negative elements in the range."<<endl; } return 0; }
/*search 在范围 A 中查找第一个与范围 B 等价的子范围的位置*/
#include <iostream> #include <algorithm> #include <vector> using namespace std; bool mypredicate(int i,int j){ return (i == j); } int main(int argc, const char * argv[]) { vector<int> haystack; for (int i = 1; i < 10; i++) haystack.push_back(i * 10); //using default comparison int needle1[] = {20,30,40,50}; vector<int>::iterator it; it = search(haystack.begin(), haystack.end(), needle1, needle1 + 4); if (it != haystack.end()) cout<<"needle1 found at position " << (it - haystack.begin()) <<endl; else cout<<"needle1 not found"<<endl; //using predicate comparison: int needle2[] = {20,30,50}; it = search(haystack.begin(), haystack.end(), needle2, needle2 + 3, mypredicate); if (it != haystack.end()) cout<<"needle2 found at position " <<(it - haystack.begin()) <<endl; else cout<<"needle2 not found"<<endl; return 0; }
/*search_n 在给定范围中查找第一个连续 n 个元素都等价于给定值的子范围的位置*/
#include <iostream> #include <algorithm> #include <vector> using namespace std; bool mypredicate(int i,int j){ return (i == j); } int main(int argc, const char * argv[]) { int myints[] = {10,20,30,30,20,10,10,20}; vector<int> myvector(myints,myints + 8); vector<int>::iterator it; //using default comparison: it = search_n(myvector.begin(), myvector.end(), 2, 30); if (it != myvector.end()) cout<<"two 30s found at position "<<(it -myvector.begin())<<endl; else cout<<"match not found"<<endl; //using predicate comparison: it = search_n(myvector.begin(), myvector.end(), 2, 10,mypredicate); if (it != myvector.end()) cout<<"two 10s found at position "<<int(it - myvector.begin())<<endl; else cout<<"match not found"<<endl; return 0; }