目录
一、vector类
vecotr是可以改变大小的数组的序列容器,其特点有:
(1)vector采用连续空间来存储元素,可以使用下标访问vector元素,访问元素和数组一样方便。vector大小可以动态改变,而且会被容器自动处理,这一点数组无法做到。
(2)vector使用动态分配分配数组来存储元素,插入新元素时,vector数组为了增加存储空间,会分配一个新数组,再把所有元素全部移动到这个数组里,代价相对高一些。
(3)vector会分配额外的空间来满足可能的增长,因为分配的存储空间比实际需要的的存储空间更大。vector以动态增长的方式管理存储空间。
(4)vector在访问元素、末尾添加删除元素时很高效,在其他位置插入删除需要挪动元素,效率低。
二、vector类成员
1.vector类对象构造
//构造空的vector
explicit vector (const allocator_type& alloc = allocator_type());
//构造一个vector,有n个元素,每个元素值为val
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
//构造一个vector,值为InputIterator的first到last之间的元素
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
//使用x拷贝构造一个vector
vector (const vector& x);
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;//构造一个没有元素的空容器
vector<int> v1(3, 5);//构造一个有3个元素的容器,每个元素的值都为5
vector<int> v2(v1.begin(),v1.end());//构造一个从v1.begin()到v1.end()顺序及相同值的容器
vector<int> v3(v2);//以与v2相同的顺序及值拷贝构造一个容器
//插入4个元素
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
return 0;
}
2.vector元素访问符
reference operator[] (size_type n); //可读可写
const_reference operator[] (size_type n) const;//只读
vector使用operator[ ]遍历元素,像数组一样:
for (size_t i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
3.vector迭代器
迭代器是一种容器可以统一使用的遍历方式,因此vector也支持使用迭代器遍历
iterator begin(); //可读可写
const_iterator begin() const;//只读
iterator end(); //可读可写
const_iterator end() const; //只读
reverse_iterator rbegin(); //反向迭代器 可读可写
const_reverse_iterator rbegin() const; //反向迭代器 只读
reverse_iterator rbegin(); //反向迭代器 可读可写
const_reverse_iterator rbegin() const; //反向迭代器 只读
(1)迭代器
①可读可写
vector<int>::iterator it = v.begin();//可读可写
while (it != v.end())
{
*it += 2;
cout << *it << " ";
it++;
}
cout << endl;
②只读
vector<int>::const_iterator it = v.begin();//只读
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
(2)反向迭代器 (这段代码屏蔽了(1)的迭代器)
①可读可写
vector<int>::reverse_iterator rit = v.rbegin();//可读可写
while (rit != v.rend())
{
*rit += 2;
cout << *rit << " ";
rit++;
}
cout << endl;