标准库类型 Vector(容器)
定义和初始化vector对象
上代码
// 初始化vector对象的方法
vector <int> v1;
// v1是一个空vector,其潜在元素是int类型
vector <int> v2(v1);
// v2是包含v1所有元素的副本
vector <int>v3=v1;
//拷贝初始化
vector<int> v4( int n, int val);
//包含了N个重复元素,每个元素的值都是val
vector<char>v5{ 'a','b'};
//v5包含初始值个数的元素,每个元素的值给出
- 注意: 两个vector对象的类型必须相同
C++列表初始化
vector<string> articale={"a","an","the"};
// 列表初始化初始值必须用{}表示,不能用()表示
vector<string> articale=("a","an","the") ; //始化错误
- 一般来说,可以只提供vector对象容纳的数量而略去初始值,内置类型由类默认初始化
- 但要求类必须明确提供初始值,且如果只提供数量,只能直接初始化,不能拷贝初始化
vector <int> ivec(10); // 10 个元素,每个初始化为0
vector <string>svec(10); // 10个元素,每个都是空string对象
vector <int> vi =10 ; // 错误,必须使用直接初始化指定向量大小
关于初始化中的圆括号和花括号问题
- 如果使用的是圆括号,则提供的值用于构造vector对象,有点类似函数的传递的构造的参数。
vector <int> v1(10); // v1由有10元素,10是构造的vector对象的元素个数
vector <int> v2(10,1); //构造一个含有10个int类型,每个初始值为1的vector对象
- 如果使用的是花括号,代表我们想用列表中的元素初始化vector对象
vector <int> v3{10}; // v3有一个int 类型,值为10 的元素
vector<int> v4{10,1}; //v4包含10 和1 两个元素
但是,如果初始化使用了花括号但是所提供的值又不能作为用来列表初始化,那么就将考虑用所提供的值来构造vector对象,例如:
vector <int>v5{"hi"};
vector <string> v6("hi"); // 错误:不能用字符串字面值来构建string类型
vector<string>v7{10}; // v7 用10个默认值为空字符串元素初始化v7
vector<string> v8{10,"hi"} // v8 含有 10个值为"hi"的元素
向 vector对象中添加元素
使用vector的成员函数push_back()
- 当想要放入vector的元素很多时,初始化几乎不可能,这时我们可以使用vector的成员函数push_back
直接上代码
vector <int> v2; // 空vector 对象
for(int i=0; i !=100; i++)
v2.push_back(i); //以此把整数值放到v2尾端
// 循环结束时,v2有100个元素,值从0到99
string word;
vector<string> text;
while(cin>>word) {
text.push_back(word);
}
如果在循环体内包含有向vector对象添加元素的语句,则不能使用范围for循环
vector对象的其他操作
访问vector对象元素
1 使用索引值进行访问 v1[i] 表示v1的第i+1个元素
- 不能用下标(索引)形式添加元素-- (正确的方式是使用push_back)
vector <int> ivec; // 空vector 对象
for (decltype(ivec.size()) ix =0; ix != 10; ++ix )
ivec[ix] = ix ; // 严重 错误;ivec 不包含任何元素
试图用下标去访问一个不存在的元素不会引起编译错误,但是在运行时会产生一个未知的值
所谓的缓冲区溢出就是指的这种错误,一种有效的手段是使用范围for语句。
2 使用范围for循环对vector对象进行遍历
上代码
vector<int> v{1,2,3,4,5,6,7,8,9};
for (auto i : v )
cout >> i >> " ";
cout << endl;
同样要注意这样的auto对象不改变vector元素的值,若需改变,应该用引用 &:
for(auto &i : v)
i *= i;
vector的成员函数
1 v.empty() --返回bool类型,v为空返回0,否则返回1
2 v.size() --返回v中元素的个数
与string类型一样,此处返回值的类型是vector 定义的 size_type类型
// 如果要使用size_type,必须说明vector储存元素的类型
vector<int> :: size_type; // 正确
vector :: size_type; // 错误
vector的比较运算符
当然,只有元素的值可以比较才可行
- “==” 和 “!=” 不仅比较元素数量,而且比较对应位置的元素是否相等
- ‘<’ , ‘<=’ , ‘>’ , ‘>=’ 按照字典顺序进行比较