Effective STL:2、vector 和 string

本文深入探讨了C++ STL容器中最常用的vector和string,解释了为何应优先选择它们而非动态分配的数组。文章覆盖了提高效率的方法,如使用reserve避免不必要的重新分配,讨论了string实现的多样性,教授了如何与旧API交互,以及如何利用swap技巧管理和减少内存消耗。此外,还特别警告了vector<bool>的使用问题。

所有的 STL 容器都是有用的,但对于大多数 C++ 程序员,你会发现使用 vector 和 string 的时候会更多一些。这是可以想见的。设计 vector 和 string 的目的就是为了代替在大多数应用中使用的数组,而数组的用途是如此广泛,以至于它被包含在从 COBOL 到 Java 的所有成功的商业编程语言中。


本章的条款涵盖了 vector 和 string 的多个方面。首先会讨论为什么值得从数组转到 vector 和 string,然后探究提高 vector 和 string 效率的途径,指出不同 string 实现的重要区别,研究如何把 vector 和 string 的数据传递给只能理解 C 的 API,并学会怎样避免不必要的内存分配。最后,我们将研究一个有指导性的特例,vector < bool>,一个功能不完全的 vector。


本章中的条款将帮助你理解这两个最常用的容器,并改进对它们的使用。在学完本章之后,你将会知道如何更好地使用它们。



第13条:vector 和 string 优先于动态分配的数组


如果你正在动态地分配数组,那么你可能要做更多的工作。为了减轻自己的负担,请使用 vector 或 string。



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


首先,若能确切知道或大致预计容器中最终会有多少元素,此时可以使用 reseve。

其次,先预留足够大的空间,然后,当把所有数据都假如以后,再去除多余的容量。



第15条:注意 string 实现的多样性


string 的值可能会被引用计数,也可能不会。

string 对象大小的范围可以是 char* 指针大小的 1 倍到 7 倍。

创建一个新的字符串值可能需要零次、一次或两次动态分配内存。

string 对象可能共享,也可能不共享其大小和容量信息。

string 对象可能支持,也可能不支持针对单个对象的分配子。

不同的实现堆字符内存的最小分配单位有不同的策略。



第16条:了解如何把 vector 和 string 数据传给旧的 API


先让 C API 把数据写入到一个 vector 中,然后把数据复制到期望最终写入的 STL 容器中。



第17条:使用 “swap 技巧” 除去多余的容量


在做 swap 的时候,不仅两个容器的内容被交换,同时它们的迭代器、指针和引用也将被交换(string除外)。



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


首先,它不是一个 STL 容器。

其次,它并不存储 bool。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值