码迷,mamicode.com
首页 > 其他好文 > 详细

STL 容器(vector 和 list )

时间:2016-08-17 00:04:26      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

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()函数的使用,第三个参数的作用。

STL 容器(vector 和 list )

标签:

原文地址:http://www.cnblogs.com/yyx1-1/p/5778205.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!