标签:
1.这个容器的知识点比较杂
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 #include <vector> 4 #include <list> 5 #include <algorithm> 6 #include <numeric> 7 #include <functional> 8 9 using namespace std; 10 11 /* 12 int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 99}; 13 要求: 14 (1)将ia复制到一个vector容器vec中和一个list容器中lst中。 15 (2)将vec容器中的奇数值元素删除。 16 (3)使用内置算法计算vec窗器所有元素的和。Accumulate 17 (4)使用内置算法计算lst容器中大于5的元素的个数 count_if 18 19 */ 20 21 //lambda 表达式 22 // [](参数列表)->返回值 {函数体} 23 24 25 void print(int val) //回调函数 26 { 27 cout << val << " "; 28 } 29 //打印的三种方式(回调函数、函数对象、兰巴达表达式) 30 struct PRINT 31 { 32 void operator()(int val) 33 { 34 cout << val << " "; 35 } 36 }; 37 void printVec(vector<int>& v) 38 { 39 for_each(v.begin(), v.end(), [](int val){cout << val << " "; }); //采用兰博打表达式 40 cout << endl; 41 } 42 43 void printList(list<int>& L) //这里采用了回调函数,函数对象 44 { 45 //for_each(L.begin(), L.end(), PRINT()); //回调函数对象 46 for_each(L.begin(), L.end(), print); //回调函数 47 cout << endl; 48 } 49 50 class isGreat 51 { 52 public: 53 bool operator()(int val) 54 { 55 if (val > 5) 56 return true; 57 else 58 return false; 59 } 60 }; 61 void test04(int* arr, int len) 62 { 63 vector<int> v1; 64 list<int> l1; 65 v1.assign(arr, arr + len - 1); //将数组中的元素拷贝进容器中(第一种方法) 66 //将一个容器中的元素拷贝进另一个容器(第二种方法) 67 for (int val : v1) //C++11的表达式;此处的v1可以是数组或容器 68 { 69 l1.push_back(val); 70 } 71 //打印 72 printVec(v1); 73 printList(l1); 74 75 //(2)将vec容器中的奇数值元素删除。 erase 76 vector<int>::iterator it = v1.begin(); 77 for (; it != v1.end(); ) 78 { 79 if (*it % 2 != 0) 80 { 81 it = v1.erase(it); //这里关注 erase 的返回值,是一个迭代器。 82 //it--; //这种方法不对,有bug;它是将迭代器的移动还放在for循环的位置(正常放置),但是当第一个元素符合条件时,这种方法就出错,因为迭代器减小后,就越界了。 83 } 84 else //同时还有这步,将迭代器的移动放到下面。(这种属于通用方法,但是我还没有想懂,它删除后迭代器是如何移动的) 85 { 86 it++; 87 } 88 } 89 printVec(v1); 90 91 //(3)使用内置算法计算vec窗器所有元素的和。Accumulate 92 auto it1 = v1.begin(); //auto可以自动推导变量的类型。 93 auto sum = accumulate(it1, v1.end(), 0); //第三个参数为:求和的基数;即容器中所有的元素的和加上它就是最后的总和。 94 95 //(4)使用内置算法计算lst容器中大于5的元素的个数 96 int num = count_if(l1.begin(), l1.end(), isGreat()); 97 cout << num << endl; 98 } 99 100 int main() 101 { 102 int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 99 }; 103 int len = sizeof(ia) / sizeof(int); 104 test04(ia, len); 105 106 system("pause"); 107 return EXIT_SUCCESS; 108 }
1.这个题 的知识点:
1)vector容器在遍历的时候删除元素;这个和 erase()函数的返回值有关
2) erase()函数的返回值;(这个最重要)
3)一个容器中元素拷贝到不同类型的容器中(三种方法,一种没写,为普通的for循环遍历)
4)打印容器元素的三种方法:(回调函数,函数对象,兰巴达表达式)
5)STL的求和函数 accumulate(),第三个参数的作用;
6)auto类型;可以自动推导变量的类型
7)查找count_if()函数的使用,第三个参数的作用。
标签:
原文地址:http://www.cnblogs.com/yyx1-1/p/5778205.html