c++ - C++ 中真正空的 std::vector 是什么?

标签 c++ stl vector

我在 A 类中有两个 vector ,其中包含其他类对象 B 和 C。我确切地知道这些 vector 最多应该包含多少个元素。在类 A 的构造函数的初始化列表中,我将这些 vector 初始化为它们的最大大小(常量)。

如果我理解正确,我现在有一个 B 类对象的 vector ,这些对象已经使用它们的默认构造函数进行了初始化。正确的?当我写这段代码时,我认为这是处理事情的唯一方法。但是,我已经了解了 std::vector.reserve() 并且我想实现一些不同的东西。

我想为这些 vector 分配内存以使其增长得尽可能大,因为向它们添加内存是由用户输入控制的,所以我不希望频繁调整大小。但是,我每秒多次迭代这个 vector ,而且我目前只处理我标记为“事件”的对象。必须在每次迭代时检查类 B/C 的 bool 成员是愚蠢的。当我遍历此列表时,我什至不希望这些对象出现在我的迭代器那里。

提前保留最大空间并使用 push_back 将新对象添加到 vector 是否是解决此问题的方法?

最佳答案

vector 具有容量和大小。容量是已为其分配内存的元素数。大小是 vector 中实际存在的元素数。当大小为 0 时,vector 为空。因此,size() 返回 0 而 empty() 返回 true。这与当时 vector 的容量无关(这取决于 vector 自创建以来已完成的插入和删除次数) ). capacity() 会告诉您当前容量 - 即 vector 在必须重新分配其内部存储空间以容纳更多元素之前可以容纳的元素数量。

因此,当您构造一个vector 时,它具有一定的大小和一定的容量。默认构造的 vector 将具有零大小和实现定义的容量。您可以自由地将元素插入 vector 而不必担心 vector 是否足够大 - 最大 max_size() - max_size( )vector 在该系统上可以拥有的最大容量/大小(通常大到不用担心)。每次将项目插入 vector 时,如果它有足够的容量,则不会为 vector 分配内存分配。但是,如果插入该元素会超出 vector 的容量,则 vector 的内存将在内部重新分配,以便它有足够的容量来容纳新元素以及实现定义的新元素数量(通常,vector 的容量可能会增加一倍),然后将该元素插入到 vector 中。发生这种情况时,您不必担心增加 vector 的容量。它发生在 constant amortized time ,因此您通常不必担心这是一个性能问题。

如果您确实发现您经常向 vector 添加数据以致于发生许多重新分配,并且这是一个性能问题,那么您可以调用 reserve()会将容量至少设置为给定值。通常,当您非常清楚您的 vector 可能包含多少元素时,您会这样做。但是,除非您知道这会导致性能问题,否则这可能不是一个好主意。它只会使您的代码复杂化。和 constant amortized time通常足以避免性能问题。

您还可以使用您提到的给定数量的默认构造元素构造一个 vector,但除非您真的想要这些元素,否则这将是一个坏主意。 vector 应该做到这一点,这样您就不必担心在将元素插入其中时重新分配容器(就像您必须使用数组一样),以及其中的默认构造元素出于分配内存的目的正在打败它。如果您真的想这样做,请使用 reserve()。但同样,不要为 reserve() 而烦恼,除非您确定它会提高性能。正如在另一个答案中指出的那样,如果您根据用户输入将元素插入到 vector 中,那么 I/O 的时间成本很可能会远远超过重新分配的时间成本在相对罕见的情况下,vector 的内存用完了。

容量相关函数:

capacity()  // Returns the number of elements that the vector can hold
reserve()   // Sets the minimum capacity of the vector.

尺寸相关的函数:

clear()  // Removes all elements from the vector.
empty()  // Returns true if the vector has no elements.
resize() // Changes the size of the vector.
size()  // Returns the number of items in the vector.

关于c++ - C++ 中真正空的 std::vector 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2738896/

相关文章:

java - 如何打印 Vector[] 的所有值

c++ - 如何打印在 Yacc/Bison 中看到的任何内容?

c++ - 如何从 doxygen 输出中排除类的未记录成员函数/变量?

c++ - vector 的成对迭代

c++ - 作用于可 move 但不可复制对象序列的变异 STL 算法的行为

C++ vector<vector<double>> 加倍 **

C++ - 在运行时从基类指针识别派生类

c++ - std::stringstream 可以设置失败/坏位的方法?

c++ - STL 容器 : Constructor's Allocator parameter and scoped allocators

c++ - 尝试使用 vector 数组来实现图