cb36a_c++_STL_算法_区间的比较equal_mismatch_lexicographical_compare
*cb36a_c++_STL_算法_区间的比较equal_mismatch_lexicographical_compare
区间:容器中的全部数据或者部分数据,都叫做区间
equal(b,e,b2),比较两个容器数据是不是相等 ,b(容器1,迭代器begin()),e(容器1,迭代器end(),b2(容器2,迭代器2指向的位置,begin2
if(equal(ivec.begin(),ivec.end(),ilist.begin()))
equal(b,e,b2,p) p,parameter,函数对象,谓词
mismatch(b,e,b2)比较两个容器中第一个不相等的数据
mismatch(b,e,b2,p)
lexicographical_compare(b,e,b2,e2)用来比较第一个区间是不是不第二个区间小,区间1<区间2
lexicographical_compare(b,e,b2,e2,p)
两个字符串的字母排序是通过从第一个字符开始比较对应字符得到的。第一对不同的对应字符决定了哪个字符串排在首位。
字符串的顺序就是不同字符的顺序。如果字符串的长度相同,而且所有的字符都相等,那么这些字符串就相等。
如果字符串的长度不同,短字符串的字符序列和长字符串的初始序列是相同的,那么短字符串小于长字符串。因此 “age” 在“beauty” 之前,
“a lull” 在 “a storm” 之前。显然,“the chicken” 而不是 “the egg” 会排在首位。
对于任何类型的对象序列来说,字典序都是字母排序思想的泛化。
从两个序列的第一个元素开始依次比较对应的元素,前两个对象的不同会决定序列的顺序。显然,序列中的对象必须是可比较的。
lexicographical_compare()算法可以比较由开始和结束迭代器定义的两个序列。
它的前两个参数定义了第一个序列,第 3 和第 4 个参数分别是第二个序列的开始和结束迭代器。
默认用 < 运算符来比较元素,但在需要时,也可以提供一个实现小于比较的函数对象作为可选的第 5 个参数。
如果第一个序列的字典序小于第二个,这个算法会返回 true,否则返回 false。所以,返回 false 表明第一个序列大于或等于第二个序列。
1 /*cb36a_c++_STL_算法_区间的比较equal_mismatch_lexicographical_compare 2 3 区间:容器中的全部数据或者部分数据,都叫做区间 4 5 equal(b,e,b2),比较两个容器数据是不是相等 ,b(容器1,迭代器begin()),e(容器1,迭代器end(),b2(容器2,迭代器2指向的位置,begin2 6 if(equal(ivec.begin(),ivec.end(),ilist.begin())) 7 8 equal(b,e,b2,p) p,parameter,函数对象,谓词 9 mismatch(b,e,b2)比较两个容器中第一个不相等的数据 10 mismatch(b,e,b2,p) 11 12 13 lexicographical_compare(b,e,b2,e2)用来比较第一个区间是不是不第二个区间小,区间1<区间2 14 lexicographical_compare(b,e,b2,e2,p) 15 两个字符串的字母排序是通过从第一个字符开始比较对应字符得到的。第一对不同的对应字符决定了哪个字符串排在首位。 16 字符串的顺序就是不同字符的顺序。如果字符串的长度相同,而且所有的字符都相等,那么这些字符串就相等。 17 如果字符串的长度不同,短字符串的字符序列和长字符串的初始序列是相同的,那么短字符串小于长字符串。因此 “age” 在“beauty” 之前, 18 “a lull” 在 “a storm” 之前。显然,“the chicken” 而不是 “the egg” 会排在首位。 19 20 对于任何类型的对象序列来说,字典序都是字母排序思想的泛化。 21 从两个序列的第一个元素开始依次比较对应的元素,前两个对象的不同会决定序列的顺序。显然,序列中的对象必须是可比较的。 22 23 lexicographical_compare()算法可以比较由开始和结束迭代器定义的两个序列。 24 它的前两个参数定义了第一个序列,第 3 和第 4 个参数分别是第二个序列的开始和结束迭代器。 25 默认用 < 运算符来比较元素,但在需要时,也可以提供一个实现小于比较的函数对象作为可选的第 5 个参数。 26 如果第一个序列的字典序小于第二个,这个算法会返回 true,否则返回 false。所以,返回 false 表明第一个序列大于或等于第二个序列。 27 */ 28 29 #include <iostream> 30 #include <algorithm> 31 #include <vector> 32 #include <list> 33 34 using namespace std; 35 36 bool bothEvenOrOdd(int elem1, int elem2)//二元谓词,返回是bool型,就是谓词 37 { 38 return elem1%2 == elem2%2; 39 } 40 //两个容器奇数偶数对应。 41 42 int main() 43 { 44 vector<int> ivec; 45 list<int> ilist; 46 47 for (int i = 1; i <= 7; ++i) 48 ivec.push_back(i); 49 for (int i = 3; i <= 9; ++i) 50 ilist.push_back(i); 51 52 cout << "vector里面的数据:" << endl; 53 for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) 54 cout<< *iter << ' '; 55 cout << endl; 56 cout << "list里面的数据:" << endl; 57 for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); ++iter) 58 cout << *iter << ' '; 59 cout << endl; 60 61 if (equal(ivec.begin(), ivec.end(), ilist.begin())) 62 cout << "ivec等于ilsit" << endl; 63 else 64 cout << "ivec不等于ilist" << endl; 65 66 //谓词比较 67 //equal(b,e,b2,p) p,parameter,函数对象,谓词 68 ////两个容器奇数偶数对应。 69 if (equal(ivec.begin(), ivec.end(), ilist.begin(), bothEvenOrOdd)) 70 { 71 cout << "两个容器奇数偶数对应" << endl; 72 } 73 else 74 cout << "两个容器奇数偶数不对应" << endl; 75 76 77 78 return 0; 79 }
1 /* 2 //mismatch 返回值是pair,就是返回1对迭代器 3 pair<vector<int>::iterator, list<int>::iterator> values; 4 values = mismatch(ivec.begin(), ivec.end(), ilist.begin()); 5 cout << "找到了。/ivec里面的第一个小于等于list里面的数: " <<values.first<<" and 容器2的值:"<<values.second<< endl; 6 1>d:\users\txwtech\projects\cb36b\cb36b\cb36b.cpp(39): error C2679: 二进制“<<”: 没有找到接受“_Ty1”类型的右操作数的运算符(或没有可接受的转换) 7 8 values.first需要解引用。 9 改为:cout<<*values.first<<endl; 10 */ 11 12 13 #include <iostream> 14 #include <algorithm> 15 #include <vector> 16 #include <list> 17 18 using namespace std; 19 20 int main() 21 { 22 vector<int> ivec; 23 list<int> ilist; 24 for (int i = 1; i <= 6; ++i) 25 ivec.push_back(i); 26 for (int i = 1; i <= 16; i *= 2) 27 ilist.push_back(i); 28 ilist.push_back(3); 29 30 for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) 31 cout << *iter << ' '; 32 cout << endl; 33 for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); ++iter) 34 cout << *iter << ' '; 35 cout << endl; 36 //mismatch 返回值是pair,就是返回1对迭代器 37 pair<vector<int>::iterator, list<int>::iterator> values; 38 values = mismatch(ivec.begin(), ivec.end(), ilist.begin()); 39 40 if (values.first == ivec.end()) 41 cout << "没有找到不相等的数,但不代表两个区间相等" << endl; 42 else 43 cout << "找到了第一个不相等的,不匹配的数" <<*values.first<<" and "<<*values.second<< endl; 44 values = mismatch(ivec.begin(), ivec.end(), ilist.begin(), less_equal<int>()); 45 //less_equal<int>(),小于等于。是一个预定义函数对象.作为谓词 46 //参考:https://www.cnblogs.com/txwtech/p/12328141.html 47 //ivec里面的第一个小于等于list里面的数 48 if (values.first == ivec.end()) 49 cout << "没有找到。/ivec里面的第一个小于等于list里面的数" << endl; 50 else 51 cout << "找到了。/ivec里面的第一个小于等于list里面的数: " <<*values.first<<" and 容器2的值:"<<*values.second<< endl; 52 53 54 return 0; 55 }
1 /*cb36c 2 3 lexicographical_compare(b,e,b2,e2)用来比较第一个区间是不是不第二个区间小,区间1<区间2 4 if (lexicographical_compare(c4.begin(), c4.end(), c1.begin(), c1.end())) 5 6 lexicographical_compare(b,e,b2,e2,p) 7 两个字符串的字母排序是通过从第一个字符开始比较对应字符得到的。第一对不同的对应字符决定了哪个字符串排在首位。 8 字符串的顺序就是不同字符的顺序。如果字符串的长度相同,而且所有的字符都相等,那么这些字符串就相等。 9 如果字符串的长度不同,短字符串的字符序列和长字符串的初始序列是相同的,那么短字符串小于长字符串。因此 “age” 在“beauty” 之前, 10 “a lull” 在 “a storm” 之前。显然,“the chicken” 而不是 “the egg” 会排在首位。 11 12 对于任何类型的对象序列来说,字典序都是字母排序思想的泛化。 13 从两个序列的第一个元素开始依次比较对应的元素,前两个对象的不同会决定序列的顺序。显然,序列中的对象必须是可比较的。 14 15 lexicographical_compare()算法可以比较由开始和结束迭代器定义的两个序列。 16 它的前两个参数定义了第一个序列,第 3 和第 4 个参数分别是第二个序列的开始和结束迭代器。 17 默认用 < 运算符来比较元素,但在需要时,也可以提供一个实现小于比较的函数对象作为可选的第 5 个参数。 18 如果第一个序列的字典序小于第二个,这个算法会返回 true,否则返回 false。所以,返回 false 表明第一个序列大于或等于第二个序列。 19 20 cout << "8个list排序后,全部打印出来" << endl; 21 for_each(cc.begin(), cc.end(), printCollection); 22 cout << endl; 23 */ 24 25 #include <iostream> 26 #include <algorithm> 27 #include <list> 28 #include <vector> 29 30 using namespace std; 31 32 void printCollection(const list<int>& l) 33 { 34 for (list<int>::const_iterator iter = l.begin(); iter != l.end(); ++iter) 35 { 36 cout << *iter << ' '; 37 38 } 39 cout << endl; 40 } 41 bool lessForCollection(const list<int>& list1,const list<int>& list2) 42 { 43 return lexicographical_compare(list1.begin(), list1.end(), list2.begin(), list2.end()); 44 } 45 46 int main() 47 { 48 list<int> c1, c2, c3, c4; 49 for (int i = 1; i <= 5; ++i) 50 c1.push_back(i); 51 c4 = c3 = c2 = c1; 52 53 c1.push_back(7); 54 c3.push_back(2); 55 c3.push_back(0); 56 c4.push_back(2); 57 cout << "c1: "; 58 printCollection(c1); 59 cout << "c2: "; 60 printCollection(c2); 61 cout << "c3: "; 62 printCollection(c3); 63 cout << "c4: "; 64 printCollection(c4); 65 66 cout << "lexicogrphical返回布尔bool" << endl; 67 if (lexicographical_compare(c4.begin(), c4.end(), c1.begin(), c1.end())) 68 cout << "c4小于c1" << endl; 69 else 70 cout << "c4不小于c1" << endl; 71 72 if (lexicographical_compare(c2.begin(), c2.end(), c3.begin(), c3.end())) 73 cout << "c2小于c3" << endl; 74 else 75 cout << "c2不小于c3" << endl; 76 77 if (lexicographical_compare(c4.begin(), c4.end(), c3.begin(), c3.end())) 78 cout << "c4小于c3" << endl; 79 else 80 cout << "c4不小于c3" << endl; 81 82 vector<list<int>> cc; 83 cc.push_back(c1); 84 cc.push_back(c2); 85 cc.push_back(c3); 86 cc.push_back(c4); 87 cc.push_back(c3); 88 cc.push_back(c1); 89 cc.push_back(c4); 90 cc.push_back(c2); 91 92 cout << "8个list全部打印出来" << endl; 93 for_each(cc.begin(), cc.end(), printCollection); 94 cout << endl; 95 96 sort(cc.begin(), cc.end(), lessForCollection); 97 98 cout << "8个list排序后,全部打印出来" << endl; 99 for_each(cc.begin(), cc.end(), printCollection); 100 cout << endl; 101 102 return 0; 103 }