http://www.cplusplus.com/reference/stl/
vector:
从后面快速的插入与删除,直接访问任何元素。
可以看作动态数组。自动分配一块连续的内存空间进行数据存储。
当存储的数据超过分配的空间时,会重新分配一块内存块:
首先,会申请一块更大的内存块;
然后,将原来的数据拷贝到新的内存块中;
其次,销毁掉原内存块中的对象(调用对象的析构函数);
最后,将原来的内存空间释放掉。
随机访问方便,支持[]/vector.at()。
vector被设计成只能在后端进行追加和删除操作。 只能在最后进行push和pop,不能在头进行。
vector 类中定义了4中种构造函数:
默认构造函数:
构造一个初始长度为0的空向量.
vector<int>v1;
构造函数:有一个可选参数,如果预定义了size,他的成员都被赋为0.
vector<int>v2(init_size,0);
复制构造函数:构造一个新的向量,作为已存在的向量的完全复制.
vector<int>v3(v2);
带两个常量参数的构造函数:
vector<int>v4(first,last);
方法:
c.assign(beg,end) 将(beg; end)区间中的数据赋值给c。
c.assign(n,elem) 将n个elem的拷贝赋值给c。
c. at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back() 传回最后一个数据,不检查这个数据是否存在。
c.begin() 传回迭代器中的第一个数据地址。
c.capacity() 返回容器中数据个数。
c.clear() 移除容器中所有数据。
c.empty() 判断容器是否为空。
c.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。
c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。
c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
c.front() 传回第一个数据。
get_allocator 使用构造函数返回一个拷贝。
c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置
c.insert(pos,n,elem) // 在pos位置插入n个elem数据,无返回值
c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值
c.max_size() 返回容器中最大数据的数量。
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.rbegin() 传回一个逆向队列的第一个数据。
c.rend() 传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num) 重新指定队列的长度。
c.reserve() 保留适当的容量。
c.size() 返回容器中实际数据的个数。
c1.swap(c2) // 将c1和c2元素互换
example:
#include<iostream>
#include<vector>
using namespace std;
typedef vector<int> INTVECTOR;
int main(void)
{
INTVECTOR vec1;
INTVECTOR vec2(10,6);
INTVECTOR vec3(vec2.begin(),vec2.begin()+3);
INTVECTOR::iterator i;
cout<<"vec1.begin()--vec1.end():"<<endl;
for(i=vec1.begin();i!=vec1.end();++i)
cout<<*i<<"";
cout<<endl;
cout<<"vec2.begin()--vec2.end():"<<endl;
for(i=vec2.begin();i!=vec2.end();++i)
cout<<*i<<"";
cout<<endl;
cout<<"vec3.begin()--vec3.end():"<<endl;
for(i=vec3.begin();i!=vec3.end();++i)
cout<<*i<<"";
cout<<endl;
vec1.push_back(2);
vec1.push_back(4);
vec1.insert(vec1.begin()+1,5);
vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end());
cout<<"after push() and insert() now the vec1 is:"<<endl;
for(i=vec1.begin();i!=vec1.end();++i)
cout<<*i<<"";
cout<<endl;
vec2.assign(8,1);
cout<<"vec2.assign(8,1):"<<endl;
for(i=vec2.begin();i!=vec2.end();++i)
cout<<*i<<"";
cout<<endl;
cout<<"vec1.front()="<<vec1.front()<<endl;
cout<<"vec1.back()="<<vec1.back()<<endl;
cout<<"vec1.at(4)="<<vec1.at(4)<<endl;
cout<<"vec1[4]="<<vec1[4]<<endl;
vec1.pop_back();
vec1.erase(vec1.begin()+1,vec1.end()-2);
cout<<"vec1.pop_back() and vec1.erase():" <<endl;
for (i =vec1.begin(); i !=vec1.end(); ++i)
cout << *i << " ";
cout << endl;
cout<<"vec1.size(): "<<vec1.size()<<endl;
cout<<"vec1.empty(): "<<vec1.empty()<<endl;
}