vector是C++标准库里的一个容器,也是平时使用频率最高的容器,在这里对vector的一系列操作进行总结;
1. vector的初始化
vector<int> v1;//声明一个向量
vector<int> v2(5);//声明5个元素的向量,初始值不确定
vector<int> v3(5,1);//声明5个初始值为1的向量
vector<int> v4(v3);//拷贝赋值
vector<int> v5(v4.begin(),v4.end());
vector<int> v6(v4.begin(),v4.begin()+3);//用另一个序列的部分来初始化
vector<int> v7={1,2,3,4};//列表初始化,C++11支持
2.vector支持的操作
//返回迭代器
v.begin()/v.cbegin();//返回第一个元素的迭代器
v.rbegin()/v.crbegin();
v.end()/c.end();//返回最后一个元素之后的迭代器
v.rend()/c.crend();
//元素访问
v.front();//返回第一个元素
v.back();//返回最后一个元素
v[i]/v.at(i); //返回第i个元素,可能不存在;
//赋值
void assign( size_type count, const T& value );
void assign( InputIt first, InputIt last );
void assign( std::initializer_list<T> ilist );//C++11支持
vector& operator=( const vector& other );
vector& operator=( vector&& other );//C++11支持
vector& operator=( std::initializer_list<T> ilist );//C++11支持
//容量
bool empty() const;//判断容器是否为空;
size_type size() const;//返回vector的已有元素的数量;
size_type max_size() const//返回系统能容纳元素的数量;
void reserve(size_type new_cap );//为vector预留new_cap的空间大小
size_type capacity() const;//返回vector能容纳元素的数量
void shrink_to_fit();//移除没有使用的空间 C++11支持
//操作元素
void clear();//清除所有的元素,size变为0;
void push_back( const T& value );
void push_back( T&& value );//C++11支持 **这里并不懂**
void emplace_back( Args&&... args );//C++11支持 和push_back功能一样
iterator insert( iterator pos, const T& value );
iterator insert( const_iterator pos, const T& value );
iterator insert( const_iterator pos, T&& value );//C++11
iterator insert( const_iterator pos, size_type count, const T& value );
void insert( iterator pos, InputIt first, InputIt last);
iterator insert( const_iterator pos, InputIt first, InputIt last );//在pos之前插入fisrt到last指向的序列,返回插入序列的第一个元素的迭代器,if first==last return pos;
iterator insert( const_iterator pos, std::initializer_list<T> ilist );//可以插入初始化列别 C++11支持
void pop_back();删除最后一个元素
iterator erase( const_iterator pos );//删除pos指向的元素,返回下一个元素的迭代器
iterator erase( const_iterator first, const_iterator last );//删除区间,返回删除的序列后一个元素的迭代器;
void resize( size_type count );//将vector调整为count的大小
void resize( size_type count, const value_type& value );//since C++11
void swap( vector& other );//和另外一个vector交换
以上是vector几乎所有的操作,每个操作后面都有对功能的基本注解,但仍然有以下几个点应该注意:
- C++11支持用列表初始化vector;由此导致有些操作可以传入初始化列表;
- push_back和emplace_back的区别在于,前者传递的引用必须和vector的元素类型(T)一致,而后者可以是能够隐式转化为T的其他类型;
- v[i]可以用来访问元素,切记不可用来赋值;赋值可能会有意想不到的后果;
- 在像vector插入元素的时候,随着元素的增多,vector可能会出现元素的整体搬移,这个时候会出现迭代器失效的情况;在使用迭代器的时候需要注意;凡是涉及到改变vector的size的都应当引起注意;
小结
vector几乎是标准库除了string以外最常用的容器了,因此要熟练掌握它的每一个操作函数的使用。在整理的过程中会思考:操作函数的使用需要注意什么,同一个函数之间不同的重载版本之间的区别又是什么;将其整理下来,确实对vector的理解会更深。
参考引用
- http://en.cppreference.com/w/cpp/container/vector
- C++Primer 第五版
- STL源码剖析