标准库类型vector
包含头文件:#include <vector>
using std::vector;
vector是模板,不是类型,vector生成的类型必须包含vector中元素的的类型
没有引用类型的vector,有vector类型的vector
vector <int> a;
vector <vector<int>> a;
vector对象在拷贝赋值是vector对象的类型必须相同,否则会出错。
vector类型初始化:
vector <int> a(10,-1);
vector <string> b(10,"hi");
对象元素是内置类型,比如int,则元素初始值自动设为0;
对象元素是类类型,比如string,则元素初始值设为空;
vector <int> a(10); //10个元素,每个都是0
初始值还是元素数量用花括号和圆括号来区分
vector <int> a(10); //10个元素
vector <int> b{10}; //1个元素
vector <int> c(10,1); //10个元素,都是1
vector <int> d{10,1}; //两个元素
花括号无法当做花括号使用时可以认为是圆括号,但是圆括号不能认为是花括号
vector <string> a{"hi"}; // 正确
vector <string> b("hi"); //错误
vector <string> c {10}; //正确
vector <string> b{10,“hi”}; //正确
向vector中添加元素:
string word;
vector<string> text;
while(cin>>word)
text.push_back(word);
vector对象一般先声明为空对象,然后再使用时添加元素,比较高效。
vector添加元素不能使用范围for循环,因为范围for循环不能改变其所遍历序列的大小。
vector对象中的元素通过位置来访问
例如:
vector <int> v{1,2,3,4};
for(auto &i : v) //对于v中的每个元素
i *=i; //元素的平方
for(auto i : v) //对于v中的每个元素
cout<<i<<" "; //输出该元素
cout<<endl;
当使用vector定义对象时,不管是什么对象,都要声明vector对象包含元素的类型。
不能用下标形式为vector对象添加元素
vector <int> a; //a为空vector对象
for(decltype(a.size()) i = 0; i != 10;++i)
a[i] = i; //错误,a不包含任何元素
a是一个空vector,根本不包含任何元素,也就不能通过下标去访问任何元素,添加元素的正确方法是通过push_back来添加
for(decltype(a.size()) i = 0; i != 10;++i)
a.push_back(i); //正确,添加一个新元素,该元素的值是i
vector对象的下标运算符只能访问已经存在的元素,而不能用于添加元素。
通过下标访问元素可能会访问到本身不存在的元素,这样会产生严重的后果,这种错误叫做缓冲区溢出,确保下标合法的一种有效手段就是尽可能使用范围for循环