vector是一种顺序容器。
构造函数:
vector(); vector( const vector& c ); vector( size_type num, const TYPE& val = TYPE() ); vector( input_iterator start, input_iterator end );
例子:
#include <iostream> #include <vector> using namespace std; int main() { //第一种:无参数 vector<int> v; v.push_back(10); v.push_back(1); for(auto i : v) cout << i << endl; //第二种:用已有的vector来初始化 vector<int> v2(v); //将一个容器复制给另外一个容器,容器类型和元素类型都必须相同 for(auto i : v2) cout << i << endl; //第三种:指定容器内元素的个数,每个元素用默认值 vector<int> v3(4); //int的默认值是0 for(auto i : v3) cout << i << endl; //第四种:指定容器内元素的个数,指定每个元素的值 vector<int> v4(4,1); //4个1 for(auto i : v4) cout << i << endl; //第五种:将迭代器指定范围内的元素赋值给容器 auto beginIt = v.begin(); auto endIt = v.end(); vector<int> v5(beginIt, endIt); for(auto i : v5) cout << i << endl; return 0; }
注意: (1) 将一个容器复制给另外一个容器,容器类型和元素类型都必须相同。
(2) 指针也是迭代器。
int a[4] = {1,2,3,4}; vector<int> v5(a, a+4); for(auto i : v5) cout << i << endl;
(3) 其他容器的迭代器也能用来初始化vector
list<int> l; l.push_back(10); l.push_back(4); vector<int> v6(l.begin(), l.end()); for(auto i : v6) cout << i << endl;
vector常用API:
现在一个个分析:
1. assign
这是一种赋值方法,但是会覆盖原来容器内的值。
void assign( size_type num, const TYPE& val ); //num个val的值 void assign( input_iterator start, input_iterator end );
例子:
//第一种:赋值为num个val值 vector<int> v(3,5); //这里初始化为3个5 v.assign(4,10); //会覆盖上面的初始值 for(auto i : v) cout << i << endl; //输出4个0 //第二种:利用迭代器 vector<int> v2(v.begin(), v.end()); for(auto i : v) cout << i << endl; //输出4个0
2. at
返回对应坐标的值,作用同利用下标访问。
3. back
返回最后一个元素的值。
vector<int> v; v.push_back(1); v.push_back(2); cout << v.back() << endl; //输出2
4. begin
返回指向第一个元素的迭代器。
5. capacity
返回vector容器的容量,注意和大小是不同的,容量总是大于等于大小。vector总是定义一个较大的值作为容量,这样就不用每次增加元素时都换到较大的空间(这需要花费时间)。当元素增加到超过capacity时,capacity会自动加倍。
vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); //一共3个元素 cout << v.capacity() << endl; //输出4
6. clear
清空所有元素,变为空(不是默认值),但是capacity还是不变的。
vector<int> v(10,1); v.clear();
7. empty
判断vector是否为空。
vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.clear(); cout << v.empty() << endl; //输出1
8. end
返回指向最后一个元素后面一位的迭代器。
9. erase
删除迭代器指定的元素。
iterator erase( iterator loc );
iterator erase( iterator start, iterator end );
例子:
//第一种:删除迭代器指定的元素 vector<int> v; v.push_back(1); v.push_back(2); v.erase(v.begin()); cout << v[0] << endl; //输出2 //第二种:删除迭代器指定的范围 v.push_back(1); v.push_back(2); v.push_back(3); v.erase(v.begin(), v.begin()+2); for(auto i : v) cout << i << endl; //输出3
PS.耗时O(n)
注意:erase会使后面的迭代器失效,且erase返回的是下一个有效的迭代器。如果要删除值为偶数的项,应该如下:
for(auto i=v.begin(); i != v.end(); i++) { if(*i % 2 == 0) { v.erase(i); i--; } }
10. front
返回指向第一个元素的引用。
11. insert
在指定的位置之前插入元素。
方法:
iterator insert( iterator loc, const TYPE& val ); void insert( iterator loc, size_type num, const TYPE& val ); template<TYPE> void insert( iterator loc, input_iterator start, input_iterator end );
例子:
vector<int> v(2,1); vector<int> temp(3,3); v.insert(v.begin(), 11); //在begin之前插入11,即11变成第一个元素 v.insert(v.begin(), 2, 22); //在begin之前插入2个22 v.insert(v.begin(), temp.begin(), temp.end()); //在begin之前插入temp从begin到end的所有元素 for(auto e : v) cout << e << endl;
12. max_size
返回vector能容纳的元素数量的上限。注意,size是当前的元素数量,capacity是稍大于size的容量,而max_size是能容纳的最大数量。
在我的64位机子上,该值是4611686018427387903,即8字节。
13. pop_back
移除最后一个元素。
14. push_back
添加元素到最后。
vector<int> v; for(int i=0; i<10; i++) v.push_back(i); for(auto e : v) cout << e << endl;
15. rbegin
返回reverse_iterator(逆迭代器),指向最后一个元素,而且方向是向begin移动(一般迭代器加正值是向vector尾移动)。
16. rend
返回指向第一个元素前面的reverse_iterator。
vector<int> v; for(int i=0; i<10; i++) v.push_back(i); auto i = v.rbegin(); while(i != v.rend()) cout << *i++ << endl; //逆序输出vector
17. reserve
设置capacity的大小,如果小于原来的capacity则无效。
vector<int> v(10,1); v.reserve(15); cout << "capacity: " << v.capacity() << endl; //输出15 v.reserve(5); cout << "capacity: " << v.capacity() << endl; //输出15 for(auto e : v) cout << e << " ";
18. resize
方法:
void resize( size_type num, const TYPE& val = TYPE() );
例子:
//第一种 vector<int> v(10,1); v.resize(15); cout << v.size() << endl; //输出15 for(auto e : v) cout << e << " "; //多出来的5个元素填充为默认值0 cout << endl; v.resize(5); cout << v.size() << endl; //输出5 for(auto e : v) cout << e << " "; //多余元素被移除 //第二种 v.resize(15, 8); //指定多出的元素赋值为8 cout << v.size() << endl; //输出15 for(auto e : v) cout << e << " "; //多出来的元素填充为指定值8
19. size
返回当前含有的元素数量。
20. swap
交换指定容器的内容。
方法:
void swap( container& from );
例子:
vector<int> v1(4,1); vector<int> v2(6,4); v1.swap(v2); for(auto e : v1) cout << e << endl; for(auto e : v2) cout << e << endl;