STL 容器(vector 和 list )

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

				
时间: 2024-08-07 08:38:51

STL 容器(vector 和 list )的相关文章

STL容器 vector,list,deque 性能比较

C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差别并不是很大,但是当数据达到一定数量后,会明显感觉性能上有很大差异. 本文就试图从介绍,以及性能比较两个方面来讨论这个问题. vector - 会自动增长的数组 list - 擅长插入删除的链表 deque - 拥有vector和list两者优点的双端队列 性能竞技场 性能总结与使用建议 测试程序清

C++STL容器vector

vector简介 vector模塑出一个dynamic array,即动态数组.它本身是一个 “将元素置于dynamic array加以管理的抽象概念”,属于序列式容器. 使用条件: 包含头文件 #include<vector> 在此头文件中,类型vector是一个定义与namespace std 内的template: namespace std { template <typename T, typename Allocator =allocator<T> > cl

STL容器之一vector

STL中最简单也是最有用的容器之一是vector<T>类模板,称为向量容器,是序列类型容器中的一种. 容器容量可以选择性修改.(1)声明:vector<type>  v;    //容量为0构造v对象,指定元素类型为typevector<type>  v(n);    //容量为n构造v对象,指定元素类型为typevector<type>  v(n, initValue);    //容量为n构造v对象,指定元素类型为type,且所有元素被初始化为initV

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map   list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest  

【C++】STL,vector容器操作

C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化vector< typeName > v1;       //默认v1为

带你深入理解STL之Vector容器

C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便. STL实现了一个Vector容器,该容器就是来改善数组的缺点.vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充以容纳新元素.因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,再也不必因为害怕空间不足而一开始就配置一个大容量数组了,vector是用多少就分配多少. 要

C++STL之vector容器

初学STL,以下内容且当自己积累用,日后再慢慢完善. 向量容器(vector)是一种顺序容器,是一块连续分配的内存,支持随机访问,从数据安排的角度看,和数组极其相似. 数组跟vector的区别在于:数组是静态分配空间,一旦分配了空间的大小,就不可以再改变了,例如,int a[6];而vector是动态分配内存,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量,vector容器的容量增长是按照容器现在容量的一倍进行增长. 至于迭代器,它类似一个指向vector中元素的指针. -----

STL标准库-容器-vector

摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 我对向量容器vector的理解就是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector< 类型 > 标识符(最大容量,初始所有值) vector是一种类模板,那么他有很多行为与类相似 头文件 #include <vector> //a.定义 vector<typeName> v; vector<int> v; //b.拷贝构造

C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式,但是erase的返回值为下一个有效的迭代器,所以   正确方法为:: for( iter = c.begin(); iter != c.end(); ) iter = c.erase(iter); 关联性容器::(map和set比较常用) erase迭代器只是被删元素的迭代器失效,但是返回值为void, 所

C++STL之vector向量容器

vector向量容器 vector向量容器不但能向数组一样对元素进行随机访问, 还能在尾部插入元素 vector具有内存自动管理的功能, 对于元素的插入和删除, 可动态调整所占的内存空间 vector容器的下标是从0开始计数的, 也就是说, 如果vector容器的大小是n, 那么, 元素的下标是0~n-1 对于vector容器的容量定义, 可以事先定义一个固定的大小, 事后, 可以随时调整其大小; 也可以事先不定义, 随时使用push_back()方法从尾部扩张元素, 也可以使用insert()