【Effective STL】条款13-18学习笔记

条款13:尽量使用vector和string来代替动态分配的数组

这章没什么好说的,动态分配数组需要你new或new[]和delete或delete[],还必须搭配正确,调用次数统一。既然如此多的问题,那就尽量使用vector和string,他们俩是一个更好的选择。

条款14:使用reserve来避免不必要的重新分配

容器增长时,需执行以下步骤:
1.分配新的内存块,他有容器目前容量的几倍。vector和string的容量每次2 为因数增长。
2.把所有元素从容器的旧内存拷贝到新内存
3.销毁旧内存中对象
4.回收旧内存
相当可怕的数据!所以我们调用reserve成员函数,最小化这种情况,避免不必要的开销。
以下函数解释:
size():返回容器中有多少元素
capacity():返回容器在它已分配内存中可以容纳多少元素。
resize(Container::size_tyoe n):强制容器容纳n个元素。n<当前大小,容器尾部数据销毁。n>当前大小,新默认构造元素会添加到容器尾部。n>当前“容量”,元素加入前会“重新分配”。
reserve(Container::sizetyoe n):强制容器“容量”改为n。n<当前容量,vetor忽略n,string可能把容量减小为(size() > n ? size(): n )也就是size()和n中较大的数

【示例】假定你想建立一个容纳1-1000值的vector<int>。没有使用reserve,你可以像这样来做:

vector<int> v;
for (int i = 1; i <= 1000; ++i) v.push_back(i);
会出现2~10次重新分配(10?重新发生一次分配一般容量翻倍,10000约为2 10)
如果这么做:
vector<int> v;
v.reserve(1000);
for (int i = 1; i <= 1000; ++i) v.push_back(i);
不会发生重新分配。
【结论】
两种情况: 1.确切或大约知道有多少元素将最后出现在容器中,上例。
2.保留你可能需要的最大控件,一旦添加完全部数据,修正掉任何多余容量。

条款15:小心string实现的多样性

每个string包含了:
字符串的大小
容纳字符串字符的内存容量
字符串的值
另外,一个string可能包含它的配置器的拷贝(分配器)
以来引用计数的string实现也包含了这个值的引用计数





条款16: 如何将vector和string的数据传给遗留的API

vector<int> v;
void doSomething(const int* pInts, size_t numInts);
if (!v.empty()) {
	doSomething(&v[0], v.size());
}
以上做法来解决C风格的API。但string不合适,因为string中元素不是储存在连续内存中,而且string不是以null结尾。
void doSomething(const char *pString);

像这样:

doSomething(s.c_str());

条款17:使用“交换技巧”来修整过剩容量

class Contestant {...};
vector<Contestant> contestants;
contestants容量 增加到10W,后来减小到10

这是你怎么修整你的竞争者vector过剩容量的方法:

vector<Contestant>(contestants).swap(contestants);
建立临时vector,它是contestants的一个拷贝,vector的拷贝函数做了这个工作,但是vector拷贝函数只分配拷贝的元素需要的内存,所以临时vector没有多余的容量。这种方法同样适用于string。

条款18:避免使用vector<bool>

vector<bool>1.它不是STL容器2.它并不容纳bool
如果c是一个T类型对象的容器,且c支持operator[],那么一下代码必须能够编译:
T *p = &c[0];			// 无论operator[]返回什么,
				// 都可以用这个地址初始化一个T*
每个保存在vector中的bool占用一个单独的byte,而一个8byte的字节将容纳8个bool,在内部,vector<bool>使用了与位域(bitfield)等价思想来表示它假装容纳的bool。
替代品:1.deque<bool>2.bitset







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值