您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-07 11:42 148 查看
笔记会持续更新,有错误的地方欢迎指正,谢谢!

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为下标,下标只能访问元素,不能创造添加元素,添加元素只能用Push_back(值)。

很不幸,通过下标访问不存在的元素的行为是很常见的,会导致缓冲区溢出,产生很严重的后果,以致出现安全问题。

缓冲区溢出:向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。(恐怖.avi)

解决方法:使用 范围for循环(但是千万不能在 范围for循环 中向vector对象添加元素,这是使用vector的第一个限制),或迭代器。

v1=v2;
//拷贝替换,前提是同类型元素。

==,!=,<,<=,>,>=
//以字典顺序进行比较。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ c++primer 读书笔记