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

Rya*_*anG 3 c++ stl vector

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

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

我想为这些向量分配内存以尽可能大,因为添加到它们是由用户输入控制的,所以我不想频繁的调整.但是,我每秒迭代这个向量很多次,而且我目前只处理我标记为"活动"的对象.必须在每次迭代时检查B/C类的布尔成员是愚蠢的.我不希望这些对象甚至在那里为我的迭代器看我何时运行这个列表.

是提前保留最大空间并使用push_back向向量添加新对象的解决方案吗?

Jon*_*vis 12

A vector有容量,有大小.容量是已分配内存的元素数.Size是实际在向量中的元素数.一个vector是空的时,它的大小为0,所以,size()返回0和empty()回报true.这没有说明那时的容量vector(这将取决于vector自创建以来已经完成的插入和擦除次数等事情).capacity()将告诉你当前的容量 - 这是vector在它必须重新分配其内部存储以容纳更多内容之前可以容纳的元素数量.

因此,当你构建一个时vector,它具有一定的大小和一定的容量.默认构造vector的大小为零,实现定义的容量.您可以vector自由地插入元素而不必担心它是否vector足够大 - 最多max_size()- max_size()是该vector系统可以具有的最大容量/大小(通常足够大而不用担心).每次你插入一个项目vector,如果它有足够的容量,那么将不会分配任何内存分配vector.但是,如果插入该元素将超过其容量vector,那么vector内部将重新分配内存,以便它具有足够的容量来容纳新元素以及实现定义数量的新元素(通常,vector意志可能是容量的两倍)并且该元素被插入到向量中.这种情况发生在你不必担心增加vector容量的情况下.它发生在不变的摊销时间内,因此您通常不必担心它是性能问题.

如果你确实发现你vector经常添加许多重新分配,并且这是一个性能问题,那么你可以调用reserve()哪个将容量设置为至少给定的值.通常情况下,当您非常了解vector可能存在多少元素时,您就会这样做.但是,除非你知道它会遇到性能问题,否则它可能是一个坏主意.这只会使你的代码复杂化.而恒分期时间通常是不够好,避免出现性能问题.

你也可以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.
Run Code Online (Sandbox Code Playgroud)

尺寸相关功能:

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.
Run Code Online (Sandbox Code Playgroud)