vector是一种顺序容器。

  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<,); //这里初始化为3个5
    v.assign(,); //会覆盖上面的初始值
    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

  返回对应坐标的值,作用同利用下标访问。(比下标访问多一个好处:会进行范围检查,越界会抛出out_of_range异常。

    vector<, );
    cout << v[] << endl;
    cout << v.at() << endl; //terminate called after throwing an instance of 'std::out_of_range'    

3. back

  返回最后一个元素的值。(不进行范围检查)

    vector<int> v;
    v.push_back();
    v.push_back();
    cout << v.back() << endl; //输出2

4. begin

  返回指向第一个元素的迭代器。

5. capacity

  返回vector容器的容量,注意和大小是不同的,容量总是大于等于大小。vector总是定义一个较大的值作为容量,这样就不用每次增加元素时都换到较大的空间(这需要花费时间)。当元素增加到超过capacity时,capacity会自动加倍。

    vector<int> v;
    v.push_back();
    v.push_back();
    v.push_back(); //一共3个元素
    cout << v.capacity() << endl; //输出4

6.  clear

  清空所有元素,变为空(不是默认值),但是capacity还是不变的。

 vector<,);
 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();
    v.push_back();
    v.erase(v.begin());
    cout << v[] << endl; //输出2
    //第二种:删除迭代器指定的范围
    v.push_back();
    v.push_back();
    v.push_back();
    v.erase(v.begin(), v.begin()+);
    for(auto i : v)
        cout << i << endl; //输出3

  PS.耗时O(n)

  注意:erase会使后面的迭代器失效,且erase返回的是下一个有效的迭代器。如果要删除值为偶数的项,应该如下:

for(auto i=v.begin(); i != v.end(); i++) {
         == ) {
            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<,);
    vector<,);
    v.insert(v.begin(), ); //在begin之前插入11,即11变成第一个元素
    v.insert(v.begin(), , ); //在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;
    ; i<; 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;
    ; i<; i++)
        v.push_back(i);
    auto i = v.rbegin();
    while(i != v.rend())
        cout << *i++ << endl; //逆序输出vector

17. reserve

  设置capacity的大小,如果小于原来的capacity则无效。

    vector<,);
    v.reserve();
    cout << "capacity: " << v.capacity() << endl; //输出15
    v.reserve();
    cout << "capacity: " << v.capacity() << endl; //输出15
    for(auto e : v)
        cout << e << " ";

18.  resize

方法:

void resize( size_type num, const TYPE& val = TYPE() );

例子:

    //第一种
    vector<,);
    v.resize();
    cout << v.size() << endl; //输出15
    for(auto e : v)
        cout << e << " "; //多出来的5个元素填充为默认值0
    cout << endl;
    v.resize();
    cout << v.size() << endl; //输出5
    for(auto e : v)
        cout << e << " "; //多余元素被移除

    //第二种
    v.resize(, ); //指定多出的元素赋值为8
    cout << v.size() << endl; //输出15
    for(auto e : v)
        cout << e << " "; //多出来的元素填充为指定值8

19. size

  返回当前含有的元素数量。

20.  swap

  交换指定容器的内容。

方法:

void swap( container& from );

例子:

    vector<,);
    vector<,);
    v1.swap(v2);
    for(auto e : v1)
        cout << e << endl;
    for(auto e : v2)
        cout << e << endl;

21. 构造函数

  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) 指针也是迭代器。

     (3) 其他容器的迭代器也能用来初始化vector

其他:

(1)vector的元素类型必须具备assignable(可赋值的)和copyable(可复制的)两个性质.

(2)在末端增加或删除元素只需O(1) , 但在前端或中部插入或删除元素需O(n).

(3)尽量使用reserve()来保证容量够你用 , 避免内存重新分配.

(4)reserve()比vector(n)好,因为某些复杂的元素类型可能初始化很耗时,而reserve()则是直接指定容量大小,不涉及元素赋值问题。

(5)增加元素的操作,比如push_back, insert等,可能会导致内存重新分配,使得原来的指针,迭代器等都失效。

技巧:

1. 缩减容量

template <typename T>
void ShrinkCapacity(vector<T>& v) {
    vector<T> temp(v);
    v.swap(temp);
}

这里,temp复制v,只是创建一个刚好能容纳v所有元素的内存空间,因此多余的容量去掉了。

2. 删除与某值相等的所有元素

template <typename T>
void RemoveAllValue(vector<T>& v, const T& value) {
    v.erase(remove(v.begin(), v.end(), value), v.end());
}

remove是<algorithm>中的函数,可以删除一个区间中所有的等于value的值,把后面的元素移上来,返回结束处的迭代器。但是这个方法只是移动元素,并没有真正删除。因此之后利用erase删除多余的元素.

3. 删除与某值相等的第一个元素

template <typename T>
void RemoveValue(vector<T>& v, const T& value) {
    auto pos = find(v.begin(), v.end(), value);
    if(pos != v.end()) {
        v.erase(pos);
    }
}

C++STL -- vector 使用的更多相关文章

  1. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  2. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

  3. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  4. STL vector+sort排序和multiset/multimap排序比较

    由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在 ...

  5. STL vector 用法介绍

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  6. STL vector使用方法介绍

    介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  7. stl——vector详解

    stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...

  8. C++STL vector详解(杂谈)

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  9. C++ stl vector介绍

    转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if ...

  10. 浅谈C++ STL vector 容器

    浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...

随机推荐

  1. maven 各种用途

    1.maven 管理项目编译 作为项目编译代码管理工具,可以方便的进行编译集成. 2. maven 扩展单元测试 扩展对接junit可以方便进行单元测试 3.maven profiles各种devel ...

  2. PHP 传值和传引用、传地址的区别

    传值,   是把实参的值赋值给行参   那么对行参的修改,不会影响实参的值   传地址   是传值的一种特殊方式,只是他传递的是地址,不是普通的如int   那么传地址以后,实参和行参都指向同一个对象 ...

  3. 读取Excel数据到Table表中

    方法一: try { List<DBUtility.CommandInfo> list = new List<DBUtility.CommandInfo>(); string ...

  4. POJ3635 Full Tank?(DP + Dijkstra)

    题目大概说,一辆带有一个容量有限的油箱的车子在一张图上行驶,每行驶一单位长度消耗一单位油,图上的每个点都可以加油,不过都有各自的单位费用,问从起点驾驶到终点的最少花费是多少? 这题自然想到图上DP,通 ...

  5. linux 安装程序

    tar文件打开 tar -xvf myfile.tar bz2文件打开

  6. 元件供应商泄露情报,微软或在研发HoloLens二代

    众所周知,微软HoloLens全息影像头盔在2015年1月22日推出,到目前为止将近两年时间,那微软会何时推出新版Hololen呢?对此,591ARVR资讯网www.591arvr.com小编特别关注 ...

  7. 使用javamail发信过程中的一些问题及解决方法

    http://www.blogjava.net/TrampEagle/archive/2006/05/26/48326.html 今天在研究javamail发信的过程中,出现了一些小问题,现总结如下, ...

  8. HTTPS 原理解析(转)

    一 前言 在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全.为了保证 ...

  9. BZOJ3555 [Ctsc2014]企鹅QQ 题解

    题目大意: 有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数. 思路: Hash大法好!正着倒着各来一遍(底数不同),之后枚举不同的那一位,前后两段拼起来之后为了有区分前面一部分再乘一个数 ...

  10. topcoder SRM 619 DIV2 GoodCompanyDivTwo

    注意题目给的最后一句话,如果部门任何employee都做不同类型的工作,则这个部门是一个diverse,题目是计算department的diverse数 读起来感觉有点别扭,英语没学好的原因 int ...