定义一个顺序容器

为了定义一个容器对象 ,我们必须先包含相关联的头文件, 应该是下列头文件之一

#include <vector>
#include <list>
#include <deque>
#include <map>
#include <set>

容器对象的定义以容器类型的名字开始 ,后面是所包含的元素的实际类型,例如

vector< string > svec;
list< int > ilist;

定义了 svec 是一个内含 string 对象的主 vector, 以及 ilist 是一个 int 型对象的空 list。 svec和 ilist 都是空的。为了确认这一点, 我们可以调用 empty()操作符 ,例如:

if ( svec.empty() != true )
; // 喔, 有错误了

插入元素最简单的方法是 push_back() ,它将元素插入在容器的尾部 。例如:

string text_word;
while ( cin >> text_word )svec.push_back( text_word );

每次从标准输入读取一个字符串放到 text_word 中, 然后 push_back()再将 text_word 字符串的拷贝插入到 svec 中。 list 和 deque 容器也支持 push_front(), 它把新元素插入在链表的前端, 例如 :假设我们有一个 int 型的内置数组如下:

int ia[ 4 ] = { 0, 1, 2, 3 };

用 push_back():

for ( int ix = 0; ix < 4; ++ix )ilist.push_back( ia[ ix ] );

创建序列 0 1 2 3 然而 如果使用 push_front():

for ( int ix = 0; ix < 4; ++ix )ilist.push_front( ia[ ix ] );

则在 ilist 中创建序列 3 2 1 0
另外 ,我们或许希望为容器指定一个显式的长度, 长度可以是常量, 也可以是非常量表达式:

#include <list>
#include <vector>
#include <string>
extern int get_word_count( string file_name );
const int list_size = 64;
list< int > ilist( list_size );
vector< string > svec(get_word_count(string("Chimera")));

注:
如果一个 C++编译器不支持缺省模板参数, 那么它要求第二个实参指定分配器 (allocator)。 在这样的编译器实现下 ,上述两个定义被声明如下

list< int > ilist( list_size, - 1 );
vector< string > svec( 24, "pooh" );

allocator 类封装了分配和删除动态内存的抽象过程, 它也是标准库预定义的类. 实际上它使用了 new 和 delete操作符 ,使用这样的分配器类有两个目的 :通过把容器与内存分配策略的细节分开, 这可以简化容器类的实现 ;其次, 程序员有可能实现或者指定其他的内存分配策略, 比如使用共享内存.
如果容器的主要行为是在前端插入元素 则 deque 比 vector 的效率高 所以我们应该优先选择 deque

容器中的每个元素都被初始化为与该类型相关联的缺省值 。对于整数 :将用缺省值0 初值化所有元素。 对于 string 类 :每个元素都将用 string 的缺省构造函数初始化。

除了用相关联的初始值来初始化每个元素外 ,我们还可以指定一个值 ,并用它来初始化每个元素。
例如:

list< int > ilist( list_size, - 1 );
vector< string > svec( 24, "pooh" );

除了给出初始长度外 ,我们还可以通过 resize()操作重新设置容器的长度。 例如 ,当我们
写下面的代码时:

svec.resize( 2 * svec.size() );

我们将 svec 的长度加了一倍 ,每个新元素都被初始化为 与元素底层类型相关联的缺
省值 。
如果我们希望把每个新元素初始化为某个其他值, 则可以把该值指定为第二个参
数:

// 将新元素初始化为 piglet
svec.resize( 2 * svec.size(), "piglet" );

那么 svec 的原始定义的容量是多少 ?它的初始长度是 24 个元素 。
它的初始容量可能是多少? 对——svec 的容量也是 24 。

一般地, vector 的最小容量是它的当前长度, 当 vector的长度加倍时 ,容量一般也加倍。
我们也可以用一个现有的容器对象 初始化一个新的容器对象 。例如:

vector< string > svec2( svec );
list< int > ilist2( ilist );

每个容器支持一组关系操作符 ,我们可以用来比较两个容器 。这些关系操作符分别是:
等于 、不等于 、小于 、大于、 小于等于、大于等于
容器的比较是指两个容器的元素之间成对进行比较 。如果所有元素相等而且两个容器含有相同数目的元素 ,则两个容器相等,否则 ,它们不相等。 第一个不相等元素的比较决定了两个容器的小于或大于关系 。
例如 ,下面是一个程序的输出 ,它比较了五个 vector:

ivec1: 1 3 5 7 9 12
ivec2: 0 1 1 2 3 5 8 13
ivec3: 1 3 9
ivec4: 1 3 5 7
ivec5: 2 4
// 第一个不相等元素: 1, 0
// ivec1 大于 ivec2
ivec1 < ivec2 // flase
ivec2 < ivec1 // true
// 第一个不相等元素: 5, 9
ivec1 < ivec3 // true
// 所有元素相等, 但是, ivec4 的元素少
// 所以 ivec4 小于 ivec1
ivec1 < ivec4 // false
// 第一个不相等元素: 1, 2
ivec1 < ivec5 // true
ivec1 == ivec1 // true
ivec1 == ivec4 // false
ivec1 != ivec4 // true
ivec1 > ivec2 // true
ivec3 > ivec1 // true
ivec5 > ivec2 // true

我们能够定义的容器的类型有三个限制 。实际上, 它们只适用于用户定义的类类型

  • 元素类型必须支持等于操作符
  • 元素类型必须支持小于操作符 ,前面讨论的所有关系操作符都用这两个操作符来实现
  • 元素类型必须支持一个缺省值 ,对于类类型 ,即指缺省构造函数
    所有预定义数据类型 ,包括指针 ,都满足这些限制。 C++标准库给出的所有类类型也一样

C++ 顺序容器入门相关推荐

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

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

  2. C++知识点17——使用C++标准库(顺序容器vector常用操作)

    C++STL中的容器类型分为两种,一种是顺序容器,另一种是关联容器,这两种容器之所以被划分,本质区别是顺序容器可以通过元素在容器中的位置进行访问及存储,而关联容器只能通过键来访问和存储元素 顺序容器常 ...

  3. C++ Primer 第9章 顺序容器 第一次学习笔记

    1. 顺序容器概述 #include <vector> //可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 #include <deque> //双端队 ...

  4. c++顺序容器vector用法

    顺序容器概述 一个容器就是一些特定类型的集合.顺序容器为程序员提供了控制元素存储和访问顺序的能力.这种顺序不依赖元素的值,而是与元素加入容器时的位置相对应.所有的顺序容器都提供了快速访问元素的能力.顺 ...

  5. Tomcat容器入门介绍

    Tomcat容器入门介绍 Tomcat环境配置 PS:JDK的安装这里就不讲了,找到安装包直接下一步下一步就行了. 1.配置JDK 在Windows10下,找到环境变量 在环境变量中添加JDK主目录 ...

  6. C++ Primer 5th笔记(9)chapter9 顺序容器 vector 容器的自增长 容器适配器

    1. vector 容器的自增长:当插入元素当存储空间不足时,vector 必须重新分配存储空间(比如将新空间大小增加为当前大小的2倍) 管理容量的成员函数 操作 定义 c.shrink_to_fit ...

  7. C++ Primer 5th笔记(9)chapter9 顺序容器 构造和赋值

    1. 容器对象的构造和赋值 1.1 构造 C c; C c; //默认构造函数 C c1(c2) C c1=c2; C c{a,b,c,-} C c={a,b,c,-} C c(b,e)//eg. l ...

  8. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  9. 顺序容器----顺序容器概述,容器库概览

    一.顺序容器概述 一个容器就是一些特定类型对象的集合.顺序容器为程序员提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应. 顺序容器类型: 容器类型 说明 ...

最新文章

  1. hbase developer API 1.22版
  2. c#中通过截获windows消息禁止改变窗体大小
  3. char *c = abc和char c[]=abc
  4. 影响mysql导入效率的参数_extended-insert对mysqldump及导入性能的影响
  5. CSS3 弹性布局盒模型 Flex布局
  6. C语言学习笔记---字符读取函数scanf()、gets()、fgets()
  7. IGMC,Inductive graph-based matrix completion,基于归纳图的矩阵完成
  8. 基于SSM小区物业管理系统
  9. 天啦噜,竟然用AI来点名!你还敢逃课吗
  10. 获取wifi密码信息(仅供学习使用,勿作他用)
  11. 深入解析protobuf 2-自定义protoc 插件
  12. js如何获取中午12点的时间
  13. DBpedia Introduction
  14. 如何用python可视化疫情风险区?地图标记位置信息:数据爬取+地址解析+可视化
  15. (附源码)springboot学生社团管理系统 毕业设计 151109
  16. android端采用FFmpeg进行视频剪切、转码与添加水印
  17. 处理数据时,对数据取对数的意义
  18. 伸手摘星,未必如愿,但不会弄脏你的手……
  19. GPT系列详解:初代GPT
  20. 《凡人修真2》 架设

热门文章

  1. SQL注入1-5_cookie基于base64的注入
  2. [Python从零到壹] 四十一.图像处理基础篇之图像采样处理
  3. 【数据结构与算法】之深入解析“分数到小数”的求解思路与算法示例
  4. Metal之探究理解视频渲染RGB与YUV颜色编码
  5. 79. Word Search 单词搜索
  6. 《数据库原理与应用》(第三版)第12章 函数和游标 基础 习题参考答案
  7. 《信息学奥赛一本通》 高精除以低精。输入两个正整数,求它们的商(做整除)。
  8. 【Python1】双系统安装,深度学习环境搭建,目标检测(Tensorflow_API_SSD)
  9. 【Linux】一步一步学Linux——netstat命令(166)
  10. 【Linux系统编程】Linux 可执行文件结构与进程结构