《C++ Primer》读书笔记第三章-2-标准库类型vector

来源:互联网 发布:潍柴动力网络测评答案 编辑:程序博客网 时间:2024/04/30 12:32

笔记会持续更新,有错误的地方欢迎指正,谢谢!

vector表示对象的集合—>容器,容器里面装的都是同一个类型的对象。 要想使用vector,必须包含适当的头文件:
#include <vector>
using std::vector;

C++语言有类模板(class template)。类模板本身不是类,可以看成一份类的说明,在我的理解中情况是这样的:
vector<T>为例:
vector<int> vec1; //vec1保存int对象
vector<vector<int>> vec2; //vec2保存vector<int>对象

定义和初始化vector对象

下面列出了所有的初始化方法,挑顺手的用就行:

默认初始化

vector<int> v1; //默认初始化,空vector

值初始化

值初始化:通常使用圆括号或直接等号,但如果使用花括号但提供的值又不能用来列表初始化时,编译器也会尝试用值初始化。
vector<int> v2(v1);等价于vector<int> v2 = v1;

初始化指定数量的元素

vector<string> v3(5, "c");//有5个 字符串”c”
vector<int> v4(5);//5个0

列表初始化vector对象

vector<int> v5{1, 2, 3};

是列表初始化还是值初始化?

例子:
vector<int> v3(10, -1);//正确,10个-1,但不是列表初始化。
vector<int> v4(10);//正确,10个0,默认初始化。vector<int> v5{10, -1};//正确,列表初始化,有两个元素:10,-1。

string比int特殊一点:(看看就好,不深究)
vector<string> v6("hi");//错误
vector<string> v7{"hi"};//正确,列表初始化
vector<string> v8(10);//正确,默认初始化,10个空string对象。
vector<string> v9{10};//正确,默认初始化,10个空string对象。
vector<string> v10(10,"hi");//正确,10个”hi”元素,但不是列表初始化。
vector<string> v11{10,"hi"};//正确,10个”hi”元素,但不是列表初始化。

总结:上述只有v5和v7是列表初始化,所以,想要列表初始化,必须使用花括号,且花括号里的 值类型 必须与 定义的类型 一致。

向vector对象中添加元素

尾插,就是在后面插(好像有点不对劲2333):push_back(值)
在开始时创建空的对象,在运行时再添加元素,这个做法与C和Java等其他语言都不太一样,但这样很爽呀,这是一个容量动态增长的容器。

其他vector操作

v.empty()//返回true。
v.size()//返回vector::size_type。
v[n]//n为下标,下标只能访问元素,不能创造添加元素,添加元素只能用Push_back(值)。
很不幸,通过下标访问不存在的元素的行为是很常见的,会导致缓冲区溢出,产生很严重的后果,以致出现安全问题。
缓冲区溢出:向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。(恐怖.avi)
解决方法:使用 范围for循环(但是千万不能在 范围for循环 中向vector对象添加元素,这是使用vector的第一个限制),或迭代器。
v1=v2;//拷贝替换,前提是同类型元素。
==,!=,<,<=,>,>=//以字典顺序进行比较。

阅读全文
0 0