vector API详细学习

  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;
View Code

     (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;
View Code

 

  vector常用API:

vector API详细学习_第1张图片

  现在一个个分析:

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;

 

你可能感兴趣的:(vector)