首先来看看vector的模板声明:

template <class T, class Alloc = allocator<T>>
class vector {
    //…
};

  vector接受2个模板参数,其中分配器属于默认参数,当然如果你想使用其他分配器话,得把2个参数都写出来,一般只需写入元素类型即可进行vector模板的实例化,如:

 vector<int> vec;

  vector属于序列式容器。所谓序列式容器,其中的元素都可序,但未必有序。vector与array其实挺像的, 唯一的区别就是array是静态空间,一旦配置了就不能改变。而vector呢,如果分配的空间不足,将会重新配置一块新空间,大小是原空间的2倍,然后将元素一一搬过来,最后释放旧空间。因此,vector比array更灵活。示意图如下:

(图片来自侯捷老师课程《STL与泛型编程》, 侵删)

(重新分配新空间 ,元素转移,释放旧内存)

  顺便提一下vector的迭代器:vector的迭代器其实就是普通指针,由于vector具有连续的地址空间,所以它的迭代器类型支持Random Access iterators,随机存取,可跳跃。由于它的迭代器特性,使得vector中元素如果要实现某些算法时效率极高,如二分搜索系列算法。

  vector常用的元素操作:push_back, pop_back, erase, insert, clear等。我们主要谈谈erase.

erase算法有两个版本:

iterator erase(iterator first, iterator last);     // 清除[first, last)中的所有元素
iterator erase(iterator position);                 // 清除某个位置上的元素

  附一段测试代码(版本为Dev C++5.11):

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    int i;
    vector<, );
    cout << "size = " << iv.size() << endl;                // size = 2
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 2

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 3
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 4

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 4
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 4

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 5
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 6
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8

    ; i < iv.size(); i++) {                      // 9  9  1  2  3  4
        cout << iv[i] << ' ';
    }
    cout << endl;

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 7
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8   

    ; i < iv.size(); i++) {                      // 9  9  1  2  3  4  5
        cout << iv[i] << ' ';
    }
    cout << endl;

    vector<);
    if (ivite != iv.end()){
        iv.erase(ivite);
    }

    cout << "size = " << iv.size() << endl;                // size = 6
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8

    ; i < iv.size(); i++) {                      // 9  1  2  3  4  5
        cout << iv[i] << ' ';
    }
    cout << endl;

    ivite = find(iv.begin(), iv.end(), );
    if (ivite != iv.end()){
        iv.insert(ivite, 1, );                            // insert算法内部实现比较复杂(不做详谈)如:当备用空间不足,配置新内存的长度
    }                                                      // 旧长度的2倍,或是旧长度+新增元素个数

    cout << "size = " << iv.size() << endl;                // size = 7
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8

    ; i < iv.size(); i++) {
        cout << iv[i] << ' ';                              // 9  1  7  2  3  4  5
    }
    cout << endl;

    iv.clear();
    cout << "size = " << iv.size() << endl;                // size = 0
    cout << "capacity = " << iv.capacity() << endl;        // capacitu = 8

  return 0;
}

STL之序列容器vector的更多相关文章

  1. C++线性序列容器<vector>简单总结

    C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...

  2. STL常用序列容器

    这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...

  3. STL标准库-容器-vector

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...

  4. STL之序列容器deque

    首先看看deque的模板声明: template <class T,  class Alloc = allocator<T>>  // 原本还有个参数BufSize,现在新版本 ...

  5. C++STL(二)——vector容器

    STL--vector容器 vector对象的概念 vector基本操作 vector对象的初始化.赋值 vector查找.替换(已在上一片 string类 博客总结过了,不再总结) vector添加 ...

  6. C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

    序列性容器::(vector和list和deque)   erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被   删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...

  7. C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器

    课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...

  8. 《STL源码剖析》——第四章、序列容器

     1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...

  9. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

随机推荐

  1. mysql内存使用以及优化中需要的几点注意

    1.从内存中读取数据是微秒级别的.而从磁盘读则是毫秒级别的.二者相差一个数量级.所以想优化数据库,第一个要做到的就是优化io. 2.key_buffer_size[global]设置的内存区域大小缓存 ...

  2. 如何区分Babel中的stage-0,stage-1,stage-2以及stage-3(一)

    大家知道,将ES6代码编译为ES5时,我们常用到Babel这个编译工具.大家参考一些网上的文章或者官方文档,里面常会建议大家在.babelrc中输入如下代码: { "presets" ...

  3. day25、 静态属性、类方法、静态方法、组合、继承、

    一. 静态属性.类方法.静态方法 1.1静态属性 class Room: def __init__(self,name,owner,width,length): self.name=name self ...

  4. Google Tensorflow 源码编译(二):Bazel<v0.1.0>

    这几天终于把tensorflow安装上了,中间遇到过不少的问题,这里记录下来.供大家想源码安装的参考. 安装环境:POWER8处理器,Docker容器Ubuntu14.04镜像. Build Baze ...

  5. 单例实现c++

    #include <iostream> using namespace std; class Singleton { public: static Singleton *GetInstan ...

  6. Access forbidden! You don't have permission to access the requested object. It is either read-protected or not readable by the server

    好久不没弄 apache和php了,突然遇到这种奇葩的问题,本来想直接在网上找现成的解决思路,结果网上搜索花了不少功夫,也没找到原因. 后来看日志文件:apache\logs\error.log发现了 ...

  7. ajaxReturn

    controller:$info=array('error'=>0,'msg'=>'');if($user_info){    if($user_info['is_lock']){     ...

  8. Linux5.5安装10g rac

    以前安装总结的,现把它贴出来,虽然10g现在慢慢越少了,但也有不少生产库跑10g的. 1.vi /etc/hosts 10.168.39.243    orcldb1   10.168.39.245  ...

  9. 转ASP.NET1.1请求队列限制

    在教务web的选课的维护中,经常面临asp.net1.1报错,在客户端跳转到用户自定义页面,在服务器端可以看到如下错误信息: “/”应用程序中的服务器错误. 服务器太忙 说明: 执行当前 Web 请求 ...

  10. ndk-stack 使用(分析native代码stack)

    简介: ndk r6 版本之后开始提供该功能. 作用: ndk-stack可以把不认识的内存地址信息转换成可读的信息. 比如,把下列内容 I/DEBUG ( ): *** *** *** *** ** ...