find:
#include <iostream> #include <list> #include <algorithm> using namespace std; int main() { int a[10]={0,1,2,3,4,5,6,7,8,9}; size_t a_size = sizeof(a)/sizeof(int); list<int> li(a, a+a_size); list<int>::iterator itor1, itor2; for(itor1 = li.begin(); itor1 != li.end(); ++itor1)//打印:0 1 2 3 4 5 6 7 8 9 cout << *itor1 << " "; cout << endl; itor1 = find(li.begin(), li.end(), 5); itor2 = find(li.begin(), li.end(), 9); li.erase(itor1, itor2);//删除的区间为:[itor1, itor2)-----左闭右开 for(itor1 = li.begin(); itor1 != li.end(); ++itor1)//打印:0 1 2 3 4 9 cout << *itor1 << " "; cout << endl; return 0; }
count
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> //count 在此定义 4 5 using namespace std; 6 7 int main() 8 { 9 vector<int> vec; 10 for(vector<int>::size_type cnt1 = 0; cnt1 != 10; ++cnt1) 11 { 12 for(vector<int>::size_type cnt2 = 0; cnt2 != cnt1; ++cnt2) 13 { 14 vec.push_back(cnt2); 15 } 16 } 17 int val; 18 while(cin >> val) 19 { 20 cout << val << " 在vector中出现了 " << count(vec.begin(), vec.end(), val) << " 次。" << endl; 21 } 22 return 0; 23 }
find_first_of
1 /** 2 * find_first_of查找算法:这个算法带有两对迭代器参数来标记两段元素范围,在第一段范围内 3 * 查找与第二段范围中 任意 元素匹配的元素,然后返回一个迭代器,指向第一个匹配的元素, 4 * 如果找不到匹配元素,则返回第一个范围的end迭代器。 5 */ 6 7 /** 8 *示例:假设list1 和 list2 是两个存放名字的 list 对象,可使用find_first_of 统计 9 *有多少个名字同时出现在这两个列表当中 10 *list1 和 list2类型不必精确匹配;list1可以是list对象,list2可以是vector对象、deque对象,只要 11 *可以进行 == 操作符进行比较即可。如果list1 是 list<string> 对象,则 list2 可以是vector<char *>对象, 12 *因为string标准库为string标准库为string对象与char*对象定义了相等(==)操作符。 13 */ 14 #include <iostream> 15 #include <algorithm> 16 #include <list> 17 18 using namespace std; 19 20 int main() 21 { 22 list<string> list1; 23 list<string> list2; 24 25 list1.push_back("Jack"); 26 list1.push_back("Ben"); 27 list1.push_back("Bob"); 28 list1.push_back("Marry"); 29 30 list2.push_back("Jack"); 31 list2.push_back("Lucy"); 32 list2.push_back("Andy"); 33 list2.push_back("Bob"); 34 35 size_t cnt = 0; 36 list<string>::iterator it = list1.begin(); 37 while((it = find_first_of(it, list1.end(), list2.begin(), list2.end())) != list1.end()) 38 { 39 ++cnt; 40 ++it; 41 } 42 cout << "list1 和 list2 中公有的名字一共有 " << cnt << " 个." << endl; 43 system("pause"); 44 return 0; 45 }
erase
1 #include <iostream> 2 #include <list> 3 #include <vector> 4 #include <algorithm> 5 6 using namespace std; 7 8 int main() 9 { 10 int a[10]={0,1,2,3,4,5,6,7,8,9}; 11 size_t a_size = sizeof(a)/sizeof(int); 12 13 list<int> li(a, a+a_size); 14 cout << "初始list中元素为:" << endl; 15 for(list<int>::iterator itor = li.begin(); itor != li.end(); ++itor) 16 { 17 cout << *itor << " "; 18 } 19 cout << endl; 20 21 vector<int> ve(a, a+a_size); 22 cout << "初始vector中的元素为" << endl; 23 for(vector<int>::iterator itor = ve.begin(); itor != ve.end(); ++itor) 24 { 25 cout << *itor << " "; 26 } 27 cout << endl; 28 29 for(list<int>::iterator itor = li.begin(); itor != li.end(); ++itor) 30 { 31 if((*itor) & 1) 32 { 33 //li.erase(itor);注意这样写是错误的,不能达到预期效果,引文每次erase之后的迭代器会失效,所以要重新赋值 34 itor = li.erase(itor); //erase返回指向删除迭代器itor所指元素之后的下一个元素的迭代器, 35 //如果itor已经指向超出末端的下一位置的迭代器,则返回的迭代器也指向容器超出末端的下一位置 36 } 37 } 38 for(vector<int>::iterator itor = ve.begin(); itor != ve.end(); ++itor) 39 { 40 if(!((*itor) & 1)) 41 { 42 itor = ve.erase(itor); 43 } 44 } 45 46 47 cout << "删除奇数后list中元素为:" << endl; 48 for(list<int>::iterator itor = li.begin(); itor != li.end(); ++itor) 49 { 50 cout << *itor << " "; 51 } 52 cout << endl; 53 cout << "删除偶数后vector中元素为:" << endl; 54 for(vector<int>::iterator itor = ve.begin(); itor != ve.end(); ++itor) 55 { 56 cout << *itor << " "; 57 } 58 cout << endl; 59 system("pause"); 60 return 0; 61 } 62 63 /* 64 #include <iostream> 65 #include <list> 66 #include <vector> 67 using namespace std; 68 69 int main(int argc, char* argv[]) 70 { 71 int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 }; 72 vector<int> iVec( ia, ia+11 ); 73 list<int> iLst( ia, ia+11 ); 74 75 cout << " Before erase, the elements of iVec are:" << endl; 76 for ( vector<int>::iterator it = iVec.begin(); it != iVec.end(); ++it ) 77 cout << *it << " "; 78 cout << " Before erase, the elements of iLst are:" << endl; 79 for ( list<int>::iterator it = iLst.begin(); it != iLst.end(); ++it ) 80 cout << *it << " "; 81 82 // 2 erase 83 for ( vector<int>::iterator iter = iVec.begin(); iter != iVec.end(); ++iter ) 84 { 85 if ( *iter % 2 == 0 ) 86 { 87 iter = iVec.erase( iter ); 88 } 89 } 90 for ( list<int>::iterator Lit = iLst.begin(); Lit != iLst.end(); ++Lit ) 91 { 92 if ( *Lit % 2 == 1 ) 93 { 94 Lit = iLst.erase( Lit ); 95 --Lit; 96 } 97 } 98 99 100 // show 101 cout << " After erase, the elements of iVec are:" << endl; 102 for ( vector<int>::iterator it = iVec.begin(); it != iVec.end(); ++it ) 103 cout << *it << " "; 104 cout << " After erase, the elements of iLst are:" << endl; 105 for ( list<int>::iterator it = iLst.begin(); it != iLst.end(); ++it ) 106 cout << *it << " "; 107 cout << endl; 108 109 system("pause"); 110 return 0; 111 } 112 */
accumulate
1 /** 2 * accumulate 算法在numeric头文件中定义,accumulate有带有三个形参,头两个形参指定要累加的元素范围,第三个形参 3 * 则是累加的初值。accumulate 将它的一个内部变量设置为指定的初值,然后在此初值上累加输入范围内所有元素的值。 4 * accumulate 算法返回累加的结果,其返回类型就是第三个实参的类型 5 * accumulate 对要累加的元素类型一无所知,必须根据第三个参数来确定,所以第三个实参不能少 6 */ 7 8 /* 9 示例一:用accumulate统计vector<int>容器对象中的元素之和 10 #include <iostream> 11 #include <vector> 12 #include <numeric> //accumulate 在此定义 13 14 using namespace std; 15 16 int main() 17 { 18 vector<int> vec; 19 for(vector<int>::size_type cnt = 0; cnt != 101; ++cnt) 20 vec.push_back(cnt); 21 cout << "0到100的和为:" << accumulate(vec.begin(), vec.end(), 0) << endl; 22 system("pause"); 23 return 0; 24 } 25 */ 26 //示例二:用 accumulate 把string类型的vector容器中的元素连接起来: 27 #include <iostream> 28 #include <vector> 29 #include <numeric> 30 31 using namespace std; 32 33 int main() 34 { 35 vector<string> vec; 36 string str; 37 while(cin >> str) 38 vec.push_back(str); 39 cout << "连接后的字符串为" << accumulate(vec.begin(), vec.end(), string("")) << endl; 40 /** 41 *注意程序显示的创建了一个string对象,用作该函数调用的第三个实参。传递一个字符串字面值将会导致编译时错误。 42 *因为此时累加和的类型将是 const char*类型,而string的加法操作符所使用的操作数则分别是string和const char*类型, 43 *加法的结果将产生一个string对象,而不是const char*指针 44 */ 45 system("pause"); 46 return 0; 47 }
写容器元素的算法
1 #include <iostream> 2 #include <algorithm> 3 #include <iterator> 4 #include <list> 5 #include <vector> 6 7 using namespace std; 8 9 int main() 10 { 11 list<int> li; 12 list<int>::iterator itor; 13 for(list<int>::size_type cnt = 0; cnt != 10; ++cnt) 14 li.push_back(cnt); 15 for(itor = li.begin(); itor != li.end(); ++itor) 16 cout << *itor << " "; 17 cout << endl; 18 19 // back_inserter是插入迭代器,是可以给基础容器添加元素的迭代器 20 fill_n(back_inserter(li), 10, 0); //在原来li序列的后边插入10个0 21 22 for(itor = li.begin(); itor != li.end(); ++itor) 23 cout << *itor << " "; 24 cout << endl; 25 26 fill(li.begin(), li.end(), 0); //把li列表中的值全赋值成 0 27 for(itor = li.begin(); itor != li.end(); ++itor) 28 cout << *itor << " "; 29 cout << endl; 30 31 vector<int> ivec; 32 // copy elements from li into ivec 33 copy(li.begin(), li.end(), back_inserter(ivec)); 34 //该做法效率比较差,相当于vector<int> ivec(li.begin(), li.end()); 35 36 //replace any elements with value of 0 by 42 37 replace(li.begin(), li.end(), 0, 42);//把li中所有0变成42 38 39 //create empty vector to hold the replacement 40 vector<int> vec;//li中的元素不变,把li中的元素复制到vec中,并且把所有为0的元素改成42 41 replace_copy(li.begin(), li.end(), back_inserter(vec), 0, 42); 42 43 for(itor = li.begin(); itor != li.end(); ++itor) 44 cout << *itor << " "; 45 cout << endl; 46 47 for(vector<int>::iterator itor1 = ivec.begin(); itor1 != ivec.end(); ++itor1) 48 cout << *itor1 << " "; 49 cout << endl; 50 for(vector<int>::iterator itor1 = vec.begin(); itor1 != vec.end(); ++itor1) 51 cout << *itor1 << " "; 52 cout << endl; 53 54 55 system("pause"); 56 return 0; 57 }
对容器元素重新排序的算法
1 /** 2 * 功能:对一个存储了string类型单词的vector容器,计算该容器中有多少个由六位或以上字母组成的单词 3 *每个单词只统计一次,不考虑他出现的次数,要求以长度从小到大输出,长度相同的按照字典序从小到大输出 4 * 步骤:1、字典排序; 2、去掉所有重复的单词; 3、按照单词长度排序 4、统计长度等于后超过6个字符的单词个数 5 */ 6 #include <iostream> 7 #include <vector> 8 #include <algorithm> 9 10 using namespace std; 11 12 bool isShorter(const string &s1, const string &s2) //从小到大排序 13 { 14 return s1.size() < s2.size(); 15 } 16 17 bool GT6(const string s) 18 { 19 return s.size() >= 6; 20 } 21 22 string make_plural(size_t ctr, const string &word, const string &ending) 23 { 24 return (ctr == 1) ? word : word + ending; 25 } 26 int main() 27 { 28 vector<string> words; 29 30 string next_word; 31 while(cin >> next_word) 32 { 33 words.push_back(next_word); 34 } 35 //sort(words.begin(), words.end()); //字典序排列 36 vector<string>::iterator unique_end = unique(words.begin(), words.end());// 37 //unique算法,删除 相邻 的 重复 元素(并非真的删除,words的大小没有变化)然后重新排列输入范围内的元素 38 //并且返回一个迭代器,表示无重复的值范围的结束;unique函数只是将无重复的元素复制到序列的前端, 39 //返回的迭代器指向超出无重复元素范围的下一个位置. 40 41 words.erase(unique_end, words.end()); 42 stable_sort(words.begin(), words.end(), isShorter);//长度按照从大到小的稳定排序,所以长度相同的仍然按照的是字典序排列 43 vector<string>::size_type cnt = count_if(words.begin(), words.end(), GT6); 44 45 cout << cnt << " " << make_plural(cnt, "word", "s") << " 6 characters or longer" << endl; 46 for (vector<string>::iterator it = words.begin(); it != words.end(); ++it) 47 cout << *it << " "; 48 cout << endl; 49 50 system("pause"); 51 return 0; 52 }
unique_copy
1 //unique_copy用于指定复制不重复的元素到目标序列 2 #include <iostream> 3 #include <algorithm> 4 #include <vector> 5 #include <list> 6 7 using namespace std; 8 9 int main() 10 { 11 12 int ia[] = { 1, 2, 3, 4, 100, 100, 5 }; 13 list<int> iLst( ia, ia+7 ); 14 // testing out iLst 15 cout << " The contents of iLst: "; 16 for ( list<int>::iterator it = iLst.begin(); it != iLst.end(); ++it ) 17 cout << *it << " "; 18 cout << endl; 19 20 vector<int> iVec; 21 // copy iLst's member to iVec; 22 cout << " Using unique_copy, copy iLst's member to iVec: " << endl; 23 unique_copy( iLst.begin(), iLst.end(), back_inserter( iVec) ); 24 25 cout << " The contents of iVec: "; 26 for ( vector<int>::iterator it = iVec.begin(); it != iVec.end(); ++it ) 27 cout << *it << " "; 28 cout << endl; 29 system("pause"); 30 return 0; 31 }