笔记会持续更新,有错误的地方欢迎指正,谢谢!
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;
//拷贝替换,前提是同类型元素。
==,!=,<,<=,>,>=
//以字典顺序进行比较。