<Effective STL>笔记--vector和string

2 vector和string
~~~~~~~~~~~~~~~~~

2.1 尽量使用vector和string来代替动态分配的数组
===============================================
   1. string可能使用了引用计数,这时在多线程环境下你可能发现避免分配和拷贝所节省下的时间都花费在后台并发控制上了.(string本身实现了并发控制,可以支持多线程,但效率会降低)
   2. 若不想使用string的引用计数,则有三个替代方法
      * 看看你的库实现是否可以关闭引用计数,通常是通过改变预处理变量的值。当然那是不可移植的,但使工作变得可能,值得研究。
      * 寻找或开发一个不使用引用计数的string实现(或部分实现)替代品。
      * 考虑使用vector<char>来代替string,vector实现不允许使用引用计数,所以隐藏的多线程性能问题不会出现了。

2.2 使用reserve来避免不必要的重新分配
======================================
   1. resize和reserve的区别
      * resize会强制把容器容量改为n,当参数比当前size()少时,容器尾部的元素会被销毁.
      * 当reserve的参数比当前size()少时,vector会忽略它什么都不做,string可能把容量改为size()和n中的最大数,它不会销毁元素

2.3 小心string实现的多样性
===========================
   1. 每个string实现都容纳了下面的信息:
      * 字符串的大小,也就是它包含的字符的数目。
      * 容纳字符串字符的内存容量。
      * 这个字符串的值,也就是,构成这个字符串的字符。
   2. 一个string可能容纳:
      * 它的配置器的拷贝。
      * 值的引用计数。

2.4 如何将vector和string的数据传给遗留的API
============================================
   1. 如果你有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当作一个数组,只要使用&v[ 0 ]就可以了(前提是vector不为空,否则产生一个指向根本就不存在的东西的指针)
   2. 类似从vector上获取指向内部数据的指针的方法,对string不是可靠的,因为:
      * string中的数据并没有保证被存储在独立的一块连续内存中.
      * string的内部表示形式并没承诺以一个'\0'字符结束。
   3. string的c_str方法,在字符长度为0时,返回一个指向'\0'的指针
   4. vector承诺了与数组具有相同的潜在内存分布
      因此C风格API把数据和其他类型的容器之间相互传递时,可以通过vector中转

2.5 使用"交换技巧"来修正过剩容量
=================================
   1. 当你想对vector和string进行“收缩到合适”时,就考虑“交换技巧”。
 

 
 
  1. vector<Contestant>(contestants).swap(contestants); 
  2. /*说明 
  3. 表达式vector<Contestant>(contestants)建立一个临时vector,它是contestants的一份拷贝:vector的拷贝构造函数做了这个工作。 
  4. 但是,vector的拷贝构造函数只分配拷贝的元素需要的内存,所以这个临时vector没有多余的容量。 
  5. 然后我们让临时vector和contestants交换数据,这时我们完成了,contestants只有临时变量的修整过的容量,而这个临时变量则持有了曾经在contestants中的发胀的容量。 
  6. 在这里(这个语句结尾),临时vector被销毁,因此释放了以前contestants使用的内存。瞧!收缩到合适。 
  7. */ 



2.6 避免使用vector<bool>
=========================
   1. vector<bool>其实它不是一个STL容器,而且它不容纳bool
   2. vector<boo>::operator[]返回一个对象,其行为类似于比特的引用,也称为代理对象.
   3. 当需要vector<bool>时,标准库提供了两个替代品
      * deque<bool>
        deque提供了几乎所有vector所提供的(唯一值得注意的是reserve和capacity),而deque<bool>是一个STL容器,它保存真正的bool值。当然,deque内部内存不是连续的。所以不能传递deque<bool>中的数据给一个希望得到bool数组的C API
      * bitset 

本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1162470

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值