vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
Vector迭代器:
- begin+end: begin获取第一个位置的迭代器,end获取最后一个数据下一个位置的迭代器。
- rbegin+rend: rbegin获取最后一个位置的迭代器,rend获取第一个位置前一个位置的迭代器
如例:
void test1(vector<int> &vec)
{
vector<int>::iterator it = vec.begin();
while (it != vec.end())
{
cout << *it << endl;
it++;
}
}
void test2(vector<int> &vec)
{
vector<int>::reverse_iterator rit = vec.rbegin();
while (rit != vec.rend())
{
cout << *rit << endl;
rit++;
}
}
int main()
{
vector<int>vec(4,10);
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
test1(vec);
test2(vec);
system("pause");
return 0;
}
Vector空间增长
size 获取数据个数
capacity 获取容量大小
empty 判断是否为空
resize 改变vector的size
reserve 改变vector放入capacity
如例:
void test(vector<int> &vec)
{
cout << vec.size() << endl;//获取有效数据的大小
cout << vec.capacity() << endl;//获取容量的大小
cout << vec.empty() << endl;//检查空间是否为空
vec.resize(5);//改变有效数据的大小为5
vec.reserve(15);//改变空间的大小为15
cout << vec.size() << endl;
cout << vec.capacity() << endl;
//打印数据
vector<int>::iterator it = vec.begin();
while (it != vec.end())
{
cout << *it << endl;
it++;
}
vec.clear();//清空
cout << vec.size() << endl;
cout << vec.capacity() << endl;
cout << vec.empty() << endl;
}
Vector的增删查改
push_back 尾插
pop_back 尾删
insert 在指定位置插入val
erase 删除指定位置的数据
swap 交换两个vector的数据空间
operator[] 像数组一样访问
如例:
vector<int>::iterator find(vector<int>::iterator begin, vector<int>::iterator end,int n)
{
for (; begin != end&&n; begin++, n--);
return begin;
}
void test(vector<int> &vec)
{
vec.push_back(5);//尾插一个数据5
vec.pop_back();//从尾删除一个数据
vector<int>::iterator pos = find(vec.begin(), vec.end(), 2);//查找第2个位置数据的迭代器并返回给pos
vec.insert(pos, 12);//在pos位置插入数据12
vec.erase(pos);//删除pos位置的数据
//新建一个vector容器v并插入数据
vector<int> v;
v.push_back(5);
v.push_back(6);
v.push_back(7);
v.push_back(8);
swap(v, vec);//交换v与vec的数据
cout << vec.operator[](1)<<endl;//打印vec中位置为1处的数据
}
迭代器失效
插入数据迭代器失效
当在pos位置插入数据操作时,insert会使vector扩容,一旦扩容,pos指向的位置会被释放,故而无法对其访问。
Vector扩容并不是在原有的基础上增大空间,而是重新开辟一个合适大小的空间,在将原来vector中的数据移到新开辟的vector中,再将原来vector的释放掉。
如例:
vector<int>::iterator find(vector<int>::iterator begin, vector<int>::iterator end, int n)
{
for (; begin != end&&n; begin++, n--);
return begin;
}
void test(vector<int> &vec)
{
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
cout << vec.size() << endl;
cout << vec.capacity() << endl;
vector<int>::iterator pos = find(vec.begin(), vec.end(), 3);
vec.insert(pos, 11);
cout << *pos << endl;//出错
}
删除指定位置数据迭代器失效
将pos位置的数据删除掉,即将该数据存放的空间时放掉,在对该位置进访问即为非法访问。
如例:
vector<int>::iterator find(vector<int>::iterator begin, vector<int>::iterator end, int n)
{
for (; begin != end&&n; begin++, n--);
return begin;
}
void test(vector<int> &vec)
{
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
cout << vec.size() << endl;
cout << vec.capacity() << endl;
vector<int>::iterator pos = find(vec.begin(), vec.end(), 3);
vec.erase(pos);
cout << *pos << endl;//出错
}