1,头文件与命名空间
注意,这个size_type是特定类类型的size_type,所以必须用域操作符指明。
5,备注
对于
#include <vector>
using std::vector;
2,属性
vector不是一个数据类型,也不是类,而是一个类模板(class template)
vector的每一个具体实现才是类。
个人理解,C++用vector来取代C语言中的数组。
vector<int> ivec ;
vector<string> svec;
vector<xy_vect> xyvec;
//vector<int> vector<string>和vector<xy_vect>才是数据类型
3,vector对象的定义和初始化
四种方式:
T为数据类型内置类型或类类型都可以
unsigned int n = 5;
vector<T> v1; //v1为空,长度为0
vector<T> v2(v1); //v2为v1的一个副本,用v1来初始化v2
vector<T> v3(n,i); // i为T类型的变量(或字面值),或可以自动转化为T类型。n可以是变量或字面值。
vector<T> v4(n); //如果T为内置类型,则v4含有n个0,若T为类类型,则用默认构造函数来初始化。
对于第四种方式需要注意,如果T是类类型,其定义了构造函数但是没有定义默认构造函数,则不能使用这种vector定义方式。
第5种方式,用数组或数组的一部分初始化:
int a[5] = {1,2,3,4,5};
vector ivec(a+i,a+j);
则ivec里包含a[i]到a[j-1]的内容
注意:j一定要大于i
如果j == i,不报错,但是ivec里面没有内容;
如果j < i,一定会报错
4,vector对象的操作
(1)size:返回相应vector类定义的size_type。
vector<int>::size_type //ok!
vector::size_type //error!
(2)push_back
在vector的最后插入新的元素。
这个操作会改变vector的长度,即改变size的输出
ivect.push_back(3);
(3)empty
判断vector是否为空
(4)下标操作
类似于数组,用于读写,获取已经存在的元素。
但是千万注意,下标操作不能用来增加vector的长度,即不能用来添加元素,否则会造成“缓冲区溢出”(buffer overflow).
要想添加元素,请用push_back成员函数。
(5)erase 删除vector中的元素
这个操作并不是仅仅将已有的元素置为0,而是真正的删除它,会缩短vector的长度。
vector::erase()方法有两种重载形式
如下:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
如下:
iterator erase( iterator _Where);
iterator erase( iterator _First, iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
示例:
ivec.push_back(0);
ivec.push_back(1);
ivec.push_back(2);
ivec.push_back(2);
ivec.push_back(2);
ivec.push_back(3);
ivec.push_back(4);
cout << "before: ivec.size " << ivec.size() << endl;
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)
{
cout << *iter << endl;
}
vector<int>::iterator iter2 = ivec.begin() + 2;//改变长度之前的迭代器
cout << "*iter2 = " << *iter2 << endl;
//删除
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); )
{
if (*iter == 2)
{
iter = ivec.erase(iter);//删除后返回下一个位置
}
else
{
iter++;
}
}
cout << "after: ivec.size " << ivec.size() << endl;
5,备注
const vector<int> ivect(6);
定义了一个const vector。这代表了两个含义:
1,该vector的元素是const的,所以里面的值不能修改。
ivect[0] = 3; //error C3892: “iVec2”: 不能给常量赋值
2,该vector本身是const的,所以其大小不能改变,任何改变其大小的操作都不能实现。
iVec2.push_back(7);//不能将“this”指针从“const std::vector<_Ty>”转换为“std::vector<_Ty> &”
对于
vector<const int> ivect(6);
在visual studio下可以编译通过,但是并不限制对其元素的修改,所以和普通的vector并无区别;
在g++下根本无法编译通过。
所以结论是:不要使用这种表达方式。