C++ Primer : 第九章 : 顺序容器的定义、迭代器以及赋值与swap
顺序容器属于C++ STL的一部分,也是非常重要的一部分。
顺序容器包括:
std::vector,包含在头文件<vector>中
std::string, 包含在头文件<string>中
std::deque,包含在头文件<deque>中
std::list,包含在头文件<list>中
std::forward_list,包含在头文件<forward_list>中
std::array, 包含在头文件<array>中
顺序容器几乎可以保存任意类型的元素,我们可以定义一个容器,其元素类型可以是另一个容器。顺序容器的构造函数的一个版本接受容器大小的参数,它使用了元素类型的默认构造函数,但有些类没有构造函数,我们可以定义一个保存这种类型对象的容器,但我们在构造这种容器时不能只传递给它一个元素数目的参数,必须提供一个元素初始化器。
迭代器
迭代器支持的操作有:*iter,iter->mem,++iter,--iter, iter1 == iter2, iter1 != iter2
另外,forward_list::iterator 不支持递减--操作。
另外,string、vector、deque、array的迭代器支持这些算数运算符:
iter + n, iter - n, iter += n, iter -= n, iter1 - iter2, >、>=、<、<=
迭代器的范围是 [begin, end),首迭代器和尾后迭代器。
容器的定义和初始化
C c;
默认构造函数,如果C是一个array,则c中元素按默认方式初始化,否则c为空;
C c1(c2); c1位c2的一个拷贝,c1和c2的容器类型必须相同,而且保存的是相同的类型,
C c1=c2; 如果C是array,它们的大小必须相同;
C c{a,b,c,...}; c初始化为初始化列表的中元素,列表中的元素必须与c的元素类型相容。
C c={a,b,c,...}; 对于array类型,列表中的元素个数必须等于或小于array的大小,如果小于,array剩余的元素进行值初始化
C c(b, e);
c初始化为迭代器b到e(不包括e)之间的元素,迭代器所指向的元素必须与c中元素类型相容
只有顺序容器(不包括array)的构造函数才接受大小参数
C seq(n);
seq包含了n个元素,这些元素都进行了值初始化,此构造函数时explicit的
C seq(n,t); seq包含n个值为 t 的元素
将一个容器拷贝为另一个容器时,两个容器的类型和保存的类型必须匹配,当array进行拷贝时,它的大小还必须相等;
不过,当使用迭代器参数来拷贝元素时,就不要求两个容器必须是同一种容器了,只要两者保存的元素类型能相容就行。
array的定义和初始化:
定义一个array时,需要制定元素类型和大小。
列表初始化array时,列表中的元素个数不能超过array大小,如果个数小于array大小,将初始化array靠前的元素,剩下的进行值初始化,如果array保存的类型时类类型,则该类必须有一个默认构造函数,以便值初始化能够进行。
赋值和swap
c1 = c2;// 将c1的内容替换为c2中元素的拷贝
c1 = {a, b, c};// 赋值后, c1的大小为3
array也可以整体赋值,这正是array与内置数组的不同之处; array在赋值时,赋值符号左右两边的对象必须具有相同的类型。
array<int, 5> a1 = {1, 2, 3, 4, 5};
array<int, 5> a2 = {6, 7, 8, 9, 10};
a1 = a2; // a1中元素将替换为a2中元素的拷贝
但不能将一个花括号列表赋值数组:
a2 = {0}; // error
容器的赋值运算有如下几种:
c1 = c2;
c = {a, b, c};
swap(c1, c2); 将c1中元素替换为c2中的元素,c1和c2必须具有相同的类型
c1.swap(c2); swap通常比从c2向c1拷贝元素快的多。
// assign操作不适用于关联容器和array
seq.assign(b, e); 将seq中元素替换为迭代器b和e所指向的范围之内的元素,但是b和e不能指向seq
seq.assign(il); 将seq中元素替换为初始化列表il中的元素</span>
seq.assign(n, val); 将seq中元素替换为n个值为val的元素</span>
赋值相关运算会导致指向左边容器内部的迭代器、引用和指针失效。而swap操作将容器内容交换不会导致失效。(array和string的情况除外)
使用swap
swap操作的是两个相同类型容器的内容。除array外,交换两个容器内部的操作保证会很快,元素本身并未交换,swap只是交换了两个容器内部的数据结构。
元素不会被移动,这意味着,string除外,指向容器的迭代器、引用和指针在swap操作后不会失效。但在swap之后,这些元素已经属于不同的容器了。例如有两个容器vec1和vec2,假定iter1在swap前指向vec1[3], 在swap之后它指向vec2[3]。 但是,对一个string调用swap会导致迭代器、引用和指针失效。
swap两个array会真正的交换他们的元素,所以交换array所需要的时间和array的元素数目成正比。
新的标准库中,容器既提供成员函数版本的swap,也提供非成员函数版本的swap,我们应该习惯使用非成员版本的swap。
容器大小操作
每个容器类型都支持相等运算符 == 和 != ; 除了无需关联容器外,所有容器都支持关系运算符 >、>=、<、<= 。关系运算符左右两边的对象必须是相同类型的容器,且必须保存相同类型的元素。
实际上,容器进行比较时,使用的是元素的关系运算符完成比较,因此,只有当容器储存的元素类型定义了相应的关系运算符时,我们才可以进行关系比较!
C++ Primer : 第九章 : 顺序容器的定义、迭代器以及赋值与swap的更多相关文章
- C++ Primer 第九章 顺序容器
由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...
- C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题
顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...
- C++ Primer 读书笔记: 第9章 顺序容器
第9章 顺序容器 引: 顺序容器: vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列 顺序容器适配器: stack 后进先出栈 queue 先进先出队列 priori ...
- cb06a_c++_顺序容器的定义
/*cb06a_c++_顺序容器的定义顺序容器:vector,数组,尾端操作数据,快速随机访问list 链表,快速插入数据deque数组,双端-首尾操作数据,方便两端的数据访问 顺序容器适配器:sta ...
- C++ Primer : 第九章 : vector变长、string的其他操作以及容器适配器
vector变长机制.string的其他构造方法,添加.替换和搜索操作,string比较和数值转换,最后是容器适配器. vector对象是如何增长的 vector和string类型提供了一些成员函数, ...
- C++ Primer 5th 第9章 顺序容器
练习9.1:对于下面的程序任务,vector.deque和list哪种容器最为适合?解释你的选择的理由.如果没有哪一种容器优于其他容器,也请解释理由.(a) 读取固定数量的单词,将它们按字典序插入到容 ...
- [C++ Primer] 第9章: 顺序容器
顺序容器概述 顺序容器的类型有: 类型 说明 vector 可变长度数组. 支持快速随机访问. deque 双端队列. 支持快速随机访问. list 双向链表. 只支持双向顺序访问. forward_ ...
- 《C++ Primer》笔记 第9章 顺序容器
顺序容器类型 类型 解释 vector 可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 deque 双端队列.支持快速随机访问.在头尾位置插入.删除速度很快 list 双向链表 ...
- 【c++ Prime 学习笔记】第9章 顺序容器
一个容器是特定类型对象的集合 顺序容器中元素的顺序与其加入容器的位置对应 关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器 所有容器类共享公有接口,不同容器按不同方式扩 ...
随机推荐
- 常州培训 day7 解题报告
最后一天..有些感慨,这七天被虐的感动万分 第一题: 题目大意: 求出 n*i(i=1,2,3....n) mod p的逆元 n<p<=3000000 ,p是质数. 之前写过了,懒得再写 ...
- ionic build --release android
ionic bulid android ionic build --release android keytool -genkey -v -keystore demo.keystore -alias ...
- Linux-Gcc生成和使用静态库和动态库详解
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- 11个Linux基础面试问题
Q.1: Linux 操作系统的核心是什么? Shell Kernel Command Script Terminal 答: 内核(Kernel)是Linux 操作系统的核心.Shell是一个命令行解 ...
- Spring学习笔记之模块简介
1.Core Container(Application context) module 这个是Spring最基本的模块,它提供了spring框架最基本的功能.BeanFactory 是任何基于Spr ...
- Asp.net项目因Session阻塞导致页面打开速度变慢
发现罪魁祸首是Session阻塞造成的.默认情况下session状态是“可写状态”(EnableSessionState=”true”),即当用户打开任何一个页面时,该页面的Session就会持有一个 ...
- C/C++文件结构
总结者:kate (1).h 为头文件:存放 版权和版本声明,预处理块 ,函数和类结构声明 (2).cpp文件:代码文件,存放程序的实现 大都数时候,源文件和头文件是对应出现的,比如有一个A.cpp ...
- Swift 实现iOS Animation动画教程
这是一篇翻译文章.原文出处:http://www.raywenderlich.com/95910/uiview-animation-swift-tutorial 动画( animation)是iOS用 ...
- self.view 的不当操作造成死循环
如题,在创建ContentView的时候,例子如下 NSString *viewClassName = NSStringFromClass([self class]); viewClassName = ...
- UIControlEvents 中各种event被触发的方式解释(zz)
转自:http://blog.csdn.net/yanxiaoqing/article/details/7108891 在控件事件中,简单解释下下面几个事件.说明:由于是在“iOS 模拟器”中测试的, ...