定义:

 #include <vector>
#include <list>
#include <deque> vector<int> svec;
list<int> ilist;
deque<int> items;

初始化:

1. 将一个容器初始化为另一个容器的副本

容器类型,元素类型必须相同

     vector<int> a;
vector<double> d(a); list<double> b;
vector<double> d(b); vector<double> c;
vector<double> d(c);

只有最后一个是合法的

2. 初始化一段元素的副本

不能将一种容器内的元素赋值给另一个容器,但允许通过传递一对迭代器间接实现该功能。使用迭代器不要求容器类型相同,也不要求容器内元素类型相同,只要它们互相兼容

可以通过一个容器的迭代器初始化另一个容器,可以刻通过内置数组中的指针初始化容器(指针就是迭代器 )

 int main()
{
char *num[] = {"one","two","three","fore","five"}; //用指针的方式初始化容器
int num_size = sizeof(num)/sizeof(char *);
vector<string> vec(num,num+num_size);
for(int i = ;i < num_size;i++)
cout<<vec[i]<<endl; deque<string> deq(vec.begin(),vec.end()); //用迭代器初始化容器
for(int i = ;i < num_size;i++)
cout<<deq[i]<<endl; }

3. 分配和初始化指定数目的元素(只用于顺序容器)

     const vector<int>::size_type a_size = ;
vector<int> a(a_size);

初始化10个0(默认是0),size_type类型保存容器元素长度。

容器元素类型的约束

支持赋值运算和可以复制

容器的容器: eg:定义一个list对象来存储deque对象,该deque对象存放int型元素:list< deque<int> > lst;

注意两个相邻的< <之前必须有空格否则会被认为左移操作符

迭代器和迭代器范围

所有容器的迭代器都支持以解引用运算从容器中读入一个元素

所有容器迭代器都支持 *   ->   ++  --  ==  !=

vector,deque迭代可以进行算术运算和关系运算

list的迭代器不支持算术运算和关系运算(除了== !=)

9.9 逆序输出list:

 int main()
{
char *num[] = {"one","two","three","fore","five"};
int num_size = sizeof(num)/sizeof(char *);
list<string> lst(num,num+num_size);
list<string>::iterator ite1 = lst.begin(),ite2 = lst.end();
while(ite2 != ite1)
cout<<*(--ite2)<<endl;
}

迭代器的范围的要求:

假设[first,last)

1. 指向同一容器中的元素或超出末端的下一个位置(所以用数组a初始化一个迭代器是(a,a+a_size))

2. 如果这两个迭代器不想等,则对first反复做自增运算能达到last,就是last不能位于first之前

迭代器范围是左闭右开的意义:

1. first与last相等时迭代器为空

2. 不相等时迭代器范围内至少有一个元素

9.12  写一个形参是一对迭代器和int型整数,查找整数返回bool

 bool find_num(vector<int>::iterator ite1,vector<int>::iterator ite2,int n);
int main()
{
int num[] = {,,,,};
vector<int> vec(num,num+);
if(find_num(vec.begin(),vec.end(),))
cout<<"find"<<endl;
else
cout<<"can't find";
return ;
} bool find_num(vector<int>::iterator ite1,vector<int>::iterator ite2,int n)
{
while(ite1 != ite2)
{
if(*(ite1++) == n)
return true;
}
return false;
}

迭代器失效

向容器中增加或删除元素会使迭代器失效,建议用end操作符返回的迭代器

 vector<int>::iterator first = vec.begin(),last = vec.end();
while(first != last) //不让其失效把last替换vec.end()
{
first = v.insert(first,);
++first;
}

顺序容器的操作 p272表格已列出

容器定义类型别名

size_type  存储容器长度

iterator     此容器的迭代器类型

value_type  元素类型,程序无须直接知道容器元素的真正类型就可以使用它

reference    该容器元素的引用,value_type&的同义词

c.begin()  返回一个迭代器,指向c容器第一个元素

c.end()    返回一个迭代器,指向c容器的最后一个元素

c.push_back(t)  在容器c的尾部添加值为t的元素,返回void类型

c.push_front(t)   在容器c的前端添加值为t的元素,返回void类型(仅用于list和deque)

c.insert(p,t)     在迭代器p前插入元素t

c.insert(p,n,t)    在迭代器p前插入n个元素t

c.insert(p,b,e)   在迭代器p前插入b,e之间的元素

  

容器的比较

比较的容器必须有相同的容器类型,而且其元素类型也必须相同

容器的比较实际上就是元素的比较p277页例子

容器大小的操作

c.size()  返回容器c中的元素个数

c.empty()  检查容器是否为空,返回bool

c.resize(n) 调整容器c的大小,当前容器大小大于新的长度,则容器后的元素就都删除,小于就添加新元素,可用(n,t)指定

访问元素

front和back成员,返回容器内第一个或最后一个元素的引用

.at()方式比用[]下标操作符的好的地方在于可以检查越界

注意list容器不能通过[]下标访问,也没有.at()方法,只能通过迭代器访问

9.24 三种方式获取容器第一个元素

 int main()
{
vector<int> vec;
cout<<"Enter some intergers for vector(Ctrl + z to end)"<<endl;
int num;
while(cin>>num)
vec.push_back(num);
if(vec.empty()) //注意检查是否为空
cout<<"No element"<<endl;
else
cout<<vec.at()<<endl;  //检查越界
cout<<*vec.begin()<<endl;
cout<<vec.front()<<endl;
return ;
}

删除元素

c.erase(p)  删除迭代器p指向的元素,返回一个迭代器(指向被删除元素后面的元素)

c.erase(b,e)

c.clear()   删除容器内所有元素,返回void

c.pop_back()  删除容器c的最后一个元素,返回void

c.pop_front()  删除容器c的第一个元素,返回void(list,deque适用)

注意:pop_front和pop_back函数返回值不是被删除的元素而是void,要获取删除元素的值,则必须在删除元素之间调用front或back函数

练习.pop_back()和erase()删除其中一个元素,find方法在#include<algorithm>

 #include <iostream>
using namespace std;
#include <vector>
#include <algorithm> int main()
{
int num[] = {,,,,};
vector<int> vec(num,num+);
cout<<vec.back()<<endl;
vec.pop_back(); //vector没有pop_front方法
cout<<vec.back()<<endl; vector<int>::iterator ite;
ite = find(vec.begin(),vec.end(),);
cout<<*ite<<endl;
vec.erase(ite); return ;
}

 

9.26 删除迭代器中偶数元素

int main()
{
int ia[] = {,,,,,,,,,,};
int ia_size = sizeof(ia)/sizeof(int);
vector<int> vec(ia,ia+ia_size);
vector<int>::iterator vite = vec.begin();
while(vite != vec.end())
{
if((*vite)% == )
vite = vec.erase(vite);
else
++vite;
}
vite = vec.begin();
while(vite != vec.end())
cout<<*vite++<<" "; return ;
}

赋值与swap

c1 = c2 容器类型元素类型必须相同

c1.swap(c2)    也要求容器类型和元素类型都要相同,而且使用swap交换元素后,不会使原本指向这两个容器中的元素的迭代器失效,只不过他们都变成指向另一个迭代器中的相应位置了

c.assign(b,e)   b,e是一段迭代器,容器类型可以不同

vector容器自增长

c.capacity()    输出容器的容量

c.reserve(50)   预分配容器大小为50

容器选择:通常来说,除非找到选择使用其他容器更好的理由,否则vector容器都是最佳选择

string类型

可将string类型看作字符容器,和vector的操作类似,P289

容器适配器

stack  栈

deque    队列

priority_queue  有优先级管理的队列

stack可以和任意顺序容器关联,queue只能建立在list容器上(因为需要push_front操作),priority_queue建立在vector或者deque容器上(因为需要随机访问)

c++ primer 9 顺序容器的更多相关文章

  1. C++ Primer 笔记——顺序容器

    1.标准库中定义了一些顺序容器,所有顺序容器都提供了快速顺序访问元素的能力. 2.如果容器的元素类型没有默认构造函数,那么在构造这个容器的时候不能只指定这个容器的数目,因为没有办法默认构造这些元素. ...

  2. C++ Primer 第九章 顺序容器

    由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...

  3. C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题

    顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...

  4. C++ Primer : 第九章 : 顺序容器的定义、迭代器以及赋值与swap

    顺序容器属于C++ STL的一部分,也是非常重要的一部分. 顺序容器包括: std::vector,包含在头文件<vector>中 std::string, 包含在头文件<strin ...

  5. C++ Primer 随笔 Chapter 9 顺序容器

     参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...

  6. C++ Primer 5th 第9章 顺序容器

    练习9.1:对于下面的程序任务,vector.deque和list哪种容器最为适合?解释你的选择的理由.如果没有哪一种容器优于其他容器,也请解释理由.(a) 读取固定数量的单词,将它们按字典序插入到容 ...

  7. C++ Primer 读书笔记: 第9章 顺序容器

    第9章 顺序容器 引: 顺序容器: vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列 顺序容器适配器: stack 后进先出栈 queue 先进先出队列 priori ...

  8. C++ Primer 有感(顺序容器)

    1.顺序容器的元素排列次序与元素的值无关,而是由元素添加到容器里的次序决定. 2. 顺序容器 vector                               支持快速随机访问 list   ...

  9. [C++ Primer] 第9章: 顺序容器

    顺序容器概述 顺序容器的类型有: 类型 说明 vector 可变长度数组. 支持快速随机访问. deque 双端队列. 支持快速随机访问. list 双向链表. 只支持双向顺序访问. forward_ ...

随机推荐

  1. Ubuntu 使用Compiz配置炫酷3D桌面

    先看一下效果 要实现这种3D 的效果其实很简单. Step 1:安装N卡驱动工具 sudo apt- 这个东西其实没有太大的作用. Step 2:安装Compiz sudo apt-get insta ...

  2. Linux系统之路——如何在CentOS7.2安装MySQL

    一.Mysql 各个版本区别:1.MySQL Community Server 社区版本,开源免费,但不提供官方技术支持.2.MySQL Enterprise Edition 企业版本,需付费,可以试 ...

  3. ECONNRESET和WSAECONNRESET怎么产生的以及如何避免

    ECONNRESET是linux环境网络编程产生的错误,错误码为104, WSAECONNRESET是windows环境网络编程产生的错误,错误码为10054 两者产生的原因都一样,分以下几种情况: ...

  4. [DeeplearningAI笔记]卷积神经网络3.6-3.9交并比/非极大值抑制/Anchor boxes/YOLO算法

    4.3目标检测 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.6交并比intersection over union 交并比函数(loU)可以用来评价对象检测算法,可以被用来进一步改善对 ...

  5. Fiddler 网页采集抓包利器__手机app抓包

    用curl技术开发了一个微信文章聚合类产品,把抓取到的数据转换成json格式,并在android端调用json数据接口加以显示: 基于weiphp做了一个掌上头条插件,也是用的网页采集技术:和一个创业 ...

  6. 重构改善既有代码设计--重构手法02:Inline Method (内联函数)& 03: Inline Temp(内联临时变量)

    Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂.在函数调用点插入函数体,然后移除该函数. int GetRating() { return MoreThanfiveLa ...

  7. 搭建Elasticsearch5.6.8 分布式集群

    集群搭建 1.master[192.168.101.175] 配置elasticsearch.yml #集群名称 所有节点要相同 cluster.name: my-application #本节点名称 ...

  8. C语言与汇编语言对照分析

    游戏通常会包含各种各样的功能,如战斗系统.UI渲染.经济系统.生产系统等,每个系统又包含各式各样子功能,如伤害判定.施法.使用道具.角色移动.玩家之间交易等等.这些游戏功能在代码实现中往往少不了条件判 ...

  9. POJ 3233 Matrix Power Series (矩阵快速幂)

    题目链接 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A^2 + A^3 + - ...

  10. python基础===如何在列表,字典,集合中根据条件筛选数据

    #常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...