- 新标准库容器的性能几乎肯定与最精心优化过的同类数据结构一样好(通常会更好)。现代 C++ 程序应该使用标准库容器,而不是更原始的数据结构,如内置数组。
- 以下是一些选择容器的基本原则:
① 除非你有很好的理由选择其他容器,否则应使用 vector 。
② 如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用 list 或 forward_list 。
③ 如果程序要求随机访问元素,应使用 vector 或 deque 。
④ 如果程序只有在读取输入时才需要在容器中间位置插入元素,则
—— 首先,确定是否真的需要在容器中间位置添加元素。当处理输入数据时,通常可以很容易地向 vector 追加数据,然后再调用标准库的 sort 函数来重排容器中的元素,从而避免在中间位置添加元素。
—— 如果必须在中间位置插入元素,考虑在输入截断使用 list ,一旦输入完成,将 list 中的内容拷贝到一个 vector 中。 - 如果满足如下条件,两个迭代器 begin 和 end 构成一个迭代器范围:
① 它们指向同一个容器中的元素,或者是容器中最后一个元素之后的位置
② 我们可以通过反复递增 begin 来到达 end 。换句话说, end 不在 begin 之前。
③ 编译器不会强制这些要求。确保程序符合这些约定是程序员的责任。
- 只有顺序容器的构造函数才接受大小参数,关联容器并不支持。
- 如果我们对 array 进行列表初始化,初始值的数目必须等于或小于 array 的大小。
- 赋值相关运算会导致指向左边容器内部的迭代器、引用和指针失效。而 swap 操作将容器内容交换不会导致指向容器的迭代器、引用和指针失效(容器类型为 array 和 string 的情况除外)。
- 除 array 外, swap 不对任何元素进行拷贝、删除或插入操作,因此可以保证在常数时间内完成。元素不会被移动的事实意味着,除 string 外,指向容器的迭代器、引用和指针在 swap 操作之后都不会失效。而 string 调用 swap 会导致迭代器、引用和指针失效。
- 与其他容器不同, swap 两个 array 会真正交换它们的元素。因此,对于 array ,在 swap 操作之后,指针、引用和迭代器所绑定的元素保持不变,但元素值已经与另一个 array 中对应的元素值进行了交换。
- 只有当其元素类型也定义了相应的比较运算符时,我们才可以使用关系运算符来比较两个容器。
- 向一个 vector 、 string 或 deque 插入元素会使所有指向容器的迭代器、引用和指针失效。
- 向一个 vector 或 string 添加元素可能引起整个对象存储空间的重新分配。重新分配一个对象的存储空间需要分配新的内存,并将元素从旧的空间移动到新的空间中。
- at 和下标操作只适用于 string 、 vector 、 deque 和 array 。
- 对一个空容器调用 front 和 back ,就像使用一个越界的下标一样,是一种严重的程序设计错误。
- 如果我们希望确保下标是合法的,可以使用 at 成员函数。 at 成员函数类似下标运算符,但如果下标越界, at 会抛出一个 out_of_range 异常。
- 删除 deque 中除首尾位置外的任何元素都会使所有迭代器、引用和指针失效。指向 vector 或 string 中删除点之后位置的迭代器、引用和指针都会失效。
- 删除元素的成员函数并不检查其参数。在删除元素之前,程序员必须确保它们是存在的。
- 只有当需要的内存空间超过当前容量时, reserve 调用才会改变 vector 的容量。如果需求大小小于或等于当前容量,则 reserve 什么也不做。
- reserve 并不改变容器中元素的数量,它仅仅影响 vector 预先分配多大的内存空间。类似的, resize 成员函数只改变容器中元素的数目,而不是容器的容量。
- 在新标准库中,我们可以调用 shrink_to_fit 来要求 deque 、 vector 或 string 退回不需要的内存空间。此函数指出我们不再需要任何多余的内存空间。但是,具体的实现可以选择忽略此请求。也就是说,调用 shrink_to_fit 也并不保证一定退回内存空间。
- 每个 vector 实现都可以选择自己的内存分配策略。但是必须遵守的一条原则是:只有当迫不得已时才可以分配新的内存空间。
- 如果 string 不能转换为一个数值,这些函数抛出一个 invalid_argument 异常。如果转换得到的数值无法用任何类型来表示,则抛出一个 out_of_range 异常。
第九章 顺序容器
最新推荐文章于 2024-08-15 16:37:16 发布