在c++中,vector函数push_back会增加空数组的大小吗?
In C++, will the vector function push_back increase the size of an empty array?
快速提问。假设我声明一个大小为20的向量。然后我想用push_back给它加几个整数。
vector<int> myVector(20);
myVector.push_back(5);
myVector.push_back(14);
现在向量的容量是22,还是20?是否将5和14分别加到索引[19]和[20]?还是在[0]和[1]?
在这些语句之后,其容量是由实现定义的。(请注意这与它的大小不同)
vector<int> myVector(20);
创建一个充满20个0的向量。确切地说,它的大小是二十,容量至少是二十。是否正好是20是实现定义的;它可能有更多(实际上可能没有)。
myVector.push_back(5);
之后,数组的第21个元素为5,容量再次由实现定义。(如果容量之前正好是20,现在以未指定的方式增加。)
myVector.push_back(14);
同样,现在数组的第22个元素是14,容量由实现定义。
如果你想保留空间,但不插入元素,你可以这样做:
vector<int> myVector;
myVector.reserve(20); // capacity is at least twenty, guaranteed not
// to reallocate until after twenty elements are pushed
myVector.push_back(5); // at index zero, capacity at least twenty.
myVector.push_back(14); // at index one, capacity at least twenty.
-
size
为vector容器中的元素个数。 -
capacity
是已分配的存储空间的大小 -
push_back
有效地将矢量大小增加1,如果矢量大小等于调用前的矢量容量,则会导致内部分配的存储重新分配。
更多信息:http://www.cplusplus.com/reference/stl/vector/
push_back
增加了std::vector
的大小,并将新元素放置在vector
的后面(其他容器也有push_front
方法在前面做同样的事情)。
然而,vector
的大小和容量之间存在差异。size表示当前vector
中实际有多少项;容量表示vector
在不重新分配内存的情况下可以容纳的条目总数。
vector
,则可以使用reserve()
内存。
由于vector 不是空的,但它的大小为20(包含20个元素),并且您将push
中的2个元素添加到back
中,它现在包含22个元素。但是新元素的位置不是下标19和20,而是20和21。
如果您真的想为vector保留足够的内存以容纳20个元素(实际上不包含任何元素),以防止代价高昂的重新分配,那么您应该调用
std::vector<int> myVector;
myVector.reserve(20);
在这种情况下,vector仍然是空的,但是它有足够的内存来添加至少20个元素(例如使用push_back
),而不需要重新分配其内部存储。在这种情况下,向量只包含两个元素push
和_back
。
push_back
将使vector的容量至少增加到vector的新大小,但可能(即可能)稍大一些。
由于push_back
需要在O(1)平摊时间内运行,因此每次重新分配将是旧容量的某些倍数。在一个典型的实现中,倍数是2。
但没有指定确切的容量增加。如果需要精确控制容量,请使用reserve
。
…
重读你的问题,我不确定你理解向量的大小和容量之间的区别。大小是元素的数量。容量是指在不执行重新分配的情况下,vector容器可以容纳的元素数量。也就是说,您可以在重新分配发生之前push_back
capacity()-size()元素。
在您的示例中,5和14将分别出现在myVector[20]和myVector[21]处。
vector
有成员函数push_back
。其他序列如deque
有push_front
。
0, 1, 2, ......,最后
之后添加:
0, 1, 2, ....., final, addition,…
你可能还记得:
capacity() returns the number of elements in the vector sufficient,
without allocating additional memory.
This number can be greater or equal to size.
也就是说,不能在前面或中间添加,因为vector
是专门用于通过索引快速访问元素的。如果你想在前面和后面添加,你可以使用deque
,它类似于vector
。如果你想添加到前面,后面和任何地方,你可以使用list
。请注意,list
不像deque
和vector
那样提供索引。
然而,假定vector的容量大于其实际大小。当您向它添加元素时,它不需要分配额外的内存。只有当容量等于大小时才会这样做。在许多编译器上,新容量将是旧容量的两倍。分配后,它复制新位置中的所有元素。然而,这种行为在内存方面可能会很昂贵。
- 数组索引的值没有增加
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 如何在 turbo C++ 中增加类数组的大小?
- 如何重载运算符+= 要增加动态数组大小,请在末尾添加一个对象
- 在不使用容器或字符串库的情况下,在运行时增加动态数组大小
- 通过数组C 随机增加
- 增加类指针数组
- C++,为什么多维数组的一个元素的增加似乎增加了另一个元素
- 不断增加的指针数组 错误:赋值中的类型不兼容
- 使用数组增加文件
- 数组值无法正确增加
- 如果我们可以将特定数组元件增加/减少1,则最小总移动到平衡阵列
- 数组在方括号中增加元素是什么意思
- 为什么 c++ 字符数组大小增加 1
- 我可以通过增加指针来浏览数组吗?QT
- 当使用动态数组时,循环中的内存使用量不断增加.(C++)
- 如何增加指向字符数组的指针的位置
- C++映射数组键自动增加
- 使用大型数组索引增加访问时间