参考网页: http://www.cnblogs.com/biyeymyhjob/archive/2013/05/11/3072893.html#undefined

1.初始化的时候,最好先用reserve分配空间。

vector<int> s;
s.reserve(n);

vector中一个成员被删除,会导致后面的成员向前移动,因此进行大量复制和析构操作。
vector不适合做有大量插入,删除操作的容器,因为拷贝内存本身浪费很大。
capacity会以两倍的容量扩大。
少用push_back()多用reserve加赋值操作。
shrink_to_fit 调整capacity使其大小u与size相等。

2.访问元素优先使用at,越界的时候可以捕捉异常。

vector<int> v;
v.reserve(10);
for(int i=0; i<7; i++)
    v.push_back(i);
try
{
 int iVal1 = v[7];  // not bounds checked - will not throw
 int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch(const exception& e)
{
 cout << e.what();
}

3.从vector中有效地删除数据  (删除1到多个同样的数据)

for (iter = member.begin();iter!=member.end();)
    {
        if (*iter == 2)
        {
            iter = member.erase(iter);//即使不重新赋值也对,erase不会变成野指针。
        }
        else
            ++iter;
    }

4.压缩一个臃肿的vector (但如果压缩后,你依然要大量添加元素到这个vector,那效率还是会很低,倒不如不压缩,这也是vector一个设计理念。)
出了作用域vector还是会自动释放内存的。

压缩一个臃肿的vector clear不能真正释放内存,因为clear之后假如用户还要继续添加元素的话,可以避免重新分配内存。

resize,reserve,clear 均不会改变capacity 即容器依然占用capacity*each element空间大小的内存。

很多时候大量地删除数据,或者通过使用reserve(),结果vector的空间远远大于实际需要的。所有需要压缩vector到它实际的大小。
reserve() 增加vector的占有空间,但不会赋值,所以访问会发生越界。
resize()能够增加或者减少vector的大小(size()值),同时赋值,所以可以访问数据。
Clear()仅仅能够改变缓存的大小,可以删除元素,但不能减少占用的内存。

我们可以通过一个vector创建另一个vector。让我们看看这将发生什么。假定我们已经有一个vector v,它的内存大小为1000,当我们调用size()的时候,它的大小仅为7。我们浪费了大量的内存。让我们在它的基础上创建一个vector。

std::vector<CString> vNew(v);

cout << vNew.capacity();

vNew.capacity()返回的是7。这说明新创建的只是根据实际大小来分配的空间。现在我们不想释放v的内容,因为我们要在其它地方用到它,我们可以使用swap()将v和vNew互相交换一下。
    vNew.swap(v);
    cout << vNew.capacity();
    cout << v.capacity();

有趣的是:vNew.capacity()是1000,而v.capacity()是7。
现在是达到我的目的了,但是并不是很好的解决方法,我们可以像下面这么写:
    std::vector<CString>(v).swap(v);

你可以看到我们做了什么?我们创建了一个临时变量代替那个命名的,然后使用swap(),这样我们就去掉了不必要的空间,得到实际大小的v。
临时变量在这句代码之后就会被销毁了。

5.vector的push_back是一个复制行为,先将要push的对象复制过来所以如果对象是作用域范围比vector小的话,那么后面的操作就会造成非法访问内存。

转载于:https://www.cnblogs.com/lewiskyo/p/4214598.html

高效使用Vector相关推荐

  1. python画画bup_Python中的高效Vector / Point类

    实现高效的Vector / Point类的最佳方法是什么(甚至更好:是否有一个),可以在 Python 2.7和3.x中使用? 我找到了the blender-mathutils,但它们似乎只支持Py ...

  2. 提升vector性能的几个技巧

    原文:https://www.sohu.com/a/120595688_465979 Vector 就像是 C++ STL 容器的瑞士军刀.Bjarne Stoutsoup 有一句话 – " ...

  3. C++ 序列式容器之vector

     什么是容器 容器,顾名思义,是用来容放东西的场所.C++容器容放某种数据结构,以利于对数据的搜寻或排序或其他特殊目的.众所周知,常用的数据结构不外乎:数组array,  链表list,  树tree ...

  4. java List集合总结

    List集合 List集合代表一个有序.可重复的集合.本质是顺序表,提供增删改查数据的基本功能,且可以通过索引来插入替换和删除集合元素的方法. ArrayList ArrayList是基于数组实现的L ...

  5. 那些常见的C++、Qt基础面试题

    前言 又到了金三银四的季节,每年这个时候都是跳槽的高峰期,在整理电脑资料的过程中发现一些之前记录的面试过程中最常提到的C++和Qt相关问题,其实都是些很基础的知识点,但是在面试过程中出镜率非常高.总结 ...

  6. Clojure入门教程: Clojure – Functional Programming for the JVM中文版

    http://xumingming.sinaapp.com/302/clojure-functional-programming-for-the-jvm-clojure-tutorial/ api:h ...

  7. 容器大小_C++ 顺序容器基础知识总结

    阅读目录 0.前言 1.容器概论 2.std::array 2.1.底层数据结构 2.2.内存分配策略 2.3.array的优势在哪 3.forward_list 3.1.底层数据结构 3.2.for ...

  8. c++ array容器 传参_C++ 顺序容器基础知识总结

    阅读目录 0.前言 1.容器概论 2.std::array 2.1.底层数据结构 2.2.内存分配策略 2.3.array的优势在哪 3.forward_list 3.1.底层数据结构 3.2.for ...

  9. colojure语言基础入门

    作者:xumingming| 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://xumingming.sinaapp.com/302/clojure-funct ...

最新文章

  1. axure 导入元件库显示不出白框_AXURE免费元件库分享-web
  2. python爬虫详细步骤-Python爬虫的步骤和工具
  3. 如何在C中为一个数组分配空间?
  4. 【若依(ruoyi)】swagger 生成接口文档
  5. spring jmx_JMX和Spring –第2部分
  6. idea+JRebel实现项目热部署
  7. dataAdapter与dataSet和dataTable的填充
  8. 公司这个月要同时完成好多项目!!!
  9. Oracle 18c 新特性:动态 Container Map 增强 Application Container 灵活性
  10. java 转dwg转图片_dwg转pdf要怎么转换
  11. 批量修改Dell服务器远程管理卡iDRAC密码
  12. 理解 JavaScript 的 async/await
  13. crtmpserver 配置说明_crtmpserver框架代码详解
  14. oracle的commit耗时长_oracle-2中commit 详解
  15. opencv成员函数data,step,at的使用
  16. 如何学习angular.js
  17. python UDP Socket编程
  18. idea :插件Statistic 统计代码数量和行数
  19. robotstudio工作站建立
  20. UEFI规范实现EDKII项目学习笔记绪论[0]

热门文章

  1. sama5d3 xplained 系统加载后确认使用的网口
  2. ascx页面获取标签的通用方法
  3. 2018.10.26 NOIP模拟 瓶子 (dp/贪心)
  4. IntelliJ中的main函数、for循环、System.out.println()快捷键
  5. 22.调用element方法控制dom元素
  6. 多数据中心的高可用结构【环状星型数据库架构】
  7. 缓存初解(四)---Ibatis的缓存配置+Ehcache
  8. c语言中自守数函数,【C语言训练】自守数问题 (C语言代码)
  9. pytorch 训练过程acc_pytorch入门练手:一个简单的CNN模型
  10. POJ1236 强连通 (缩点后度数的应用)