vector容器
vector是C++标准模版库(STL,Standard Template Library)中的部分内容,vector容器强调的是提高随机访问容器内容的速度。之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 使用vector容器之前必须加上<vector>头文件:#include<vector>; vector属于std命名域的内容,因此需要通过命名限定:using std::vector;也可以直接使用全局的命名空间方式:using namespace std;
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,即内存空间增长是按照20,21,22,23.....增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,再将原先空间中的元素复制到新的空间中,性能消耗比较大,尤其是当元素是非内部数据时(非内部数据往往构造及拷贝构造函数相当复杂)。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越多,导致内存泄露,现在经常用的方法是swap函数来进行解决:vector<int> V;V.push_back(1); V.push_back(2);V.push_back(1); V.push_back(2);vector<int>().swap(V); 或者 V.swap(vector<int>());利用swap函数,和临时对象交换,使V对象的内存为临时对象的内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。
在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
1) 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2) 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3) 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque
vector成员函数
1、erase()方法:
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
std::vector<char> vec;
vec.clear();
vec.push_back('n');
vec.push_back('i');
vec.push_back('u');
vec.push_back('n');
vec.push_back('e');
vec.push_back('n');
for(vector<char>::iterator ite=vec.begin();ite!=vec.end();)
{
if('n'==*ite)
{
ite=vec.erase(ite);
}
else
{
ite++;
}
}
2、push_back(elem)在尾部插入一个elem数据。
vector<int> v;
v.push_back(1);
3、pop_back()删除末尾的数据。
vector<int> v;
v.pop_back();
4、c.assign(beg,end)将[beg,end)一个左闭右开区间的数据赋值给c。
vector<int> v1,v2;
v1.push_back(10);
v1.push_back(20);
v2.push_back(30);
v2.assign(v1.begin(),v1.end());
5、c.assign (n,elem)将n个elem的拷贝赋值给c。
vector<int> v;
v.assign(5,10);//往v里放5个10
6、at(int index)传回索引为index的数据,如果index越界,抛出out_of_range异常。
vecto<int> v;
v.at(2)//访问vector中下标是2的数据
7、c.begin()返回指向第一个数据的迭代器。 c.end()返回指向最后一个数据之后的迭代器。
8、c.rbegin()返回逆向队列的第一个数据,即c容器的最后一个数据。 c.rend()返回逆向队列的最后一个数据的下一个位置,即c容器的第一个数据再往前的一个位置。
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::reverse_iterator it;
for(it = v.rbegin();it!=v.rend();it++)
{
cout << *it << "\t";
}
9、c.clear()移除容器中的所有数据
v
ector<int>::iterator it;
for(it = v.begin();it!=v.end();it++)
{
cout << *it << "\t";
}
v.clear();
for(it = v.begin();it!=v.end();it++)
{
cout << *it << "\t";
}
10、empty()判断容器是否为空。
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
if(!v.empty())
{
cout << "v is not empty!" << endl;
}
11、c.front()返回第一个数据。 c.back()传回最后一个数据,不检查这个数据是否存在。
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
if(!vec.empty())
{
cout << “the first number is:” << v.front() << endl;
cout << “the last number is:” << v.back() << endl;
}
12、c.insert(pos,elem) 在pos位置插入一个elem的拷贝,返回插入的值的迭代器。 c.insert(pos,n,elem)在pos位置插入n个elem的数据,无返回值。 c.insert(pos,beg,end)在pos位置插入在[beg,end)区间的数据,无返回值。
vector<int> v;
v.insert(v.begin(),10);
v.insert(v.begin(),2,20);
v.insert(v.begin(),v1.begin(),v1.begin()+2);
13、c.size()返回容器中实际数据的个数。