不,缩小向量容量的唯一方法是交换技巧,如此处所示。还有C++11
我在下面提到的方式。
此外,正如裁判所说:
删除向量中的最后一个元素,
有效地将容器大小减小一。
换句话说,它改变了向量的大小而不是它的容量。
看看迭代器有效性:
结束迭代器和引用被移除元素的任何迭代器、指针和引用
都无效。
引用其他未删除元素的
迭代器、指针和引用保证会继续
引用它们在调用之前引用的相同元素。
C++11
您可以使用以std::vector<>::shrink_to_fit()
更改容量(更多信息请参见第一个链接)。(tnx Psyduck)。答案下方有有趣的评论,但这个问题与上述方法无关,所以如果有兴趣,请阅读评论。
请注意,即使这种方法也不能保证减少capacity
,正如ref所说:
请求容器减小其容量以适应其大小。
该请求是非绑定的,并且容器实现可以自由优化,否则 > 并使向量的容量大于其大小。
这可能会导致重新分配,但对向量大小没有影响,并且不能更改其 > 元素。
太奇怪了,这个函数不能保证减少capacity
并且pop_back
确实,而第二个的 ref没有提到任何相关的东西。
我看到它的方式,因为 ref 没有提到capacity
,这意味着它不需要,这意味着它capacity
保持不变。
一个有趣的例子是这样的:
#include <iostream>
#include <vector>
int main() {
const int N = 1000000;
std::vector<int> v1;
v1.reserve(N);
for (int i = 0; i < N; ++i) {
v1.push_back(i);
}
std::cout << v1.capacity() << " and size = " << v1.size() << std::endl;
for (int i = 0; i < N - 2; ++i) {
v1.pop_back();
}
std::cout << v1.capacity() << " and size = " << v1.size() << std::endl;
return 0;
}
输出:
1000000 and size = 1000000
1000000 and size = 2
wherecapacity
显然没有减少。
[编辑]
另一个相关的问题,也可以被标记为重复,有一些很好的答案。这里有一些有趣的:
1)
去看看 Scott Meyers Effective STL item 17.(一些 OP 看起来的参考)基本上你不能直接减少 std::vector 的存储大小。“技巧”是 > 创建一个大小合适的新容器,复制数据并将其与当前容器交换。
2)
不,您不能在不复制的情况下减少向量的容量。
3)
我并不是说 GCC 在没有副本的情况下不能有一些方法来做你想做的事,> 但实现起来会很棘手(我认为)因为向量需要使用 Allocator 对象来分配和释放内存,并且Allocator 的接口不包含 reallocate() 方法。我不认为这是不可能的,但它可能会很棘手。
我建议阅读链接以获取更多信息。
[编辑.2]
这个问题也支持:
问:可以pop_back()
减少capacity
吗?
答:没有。
当您不能依靠适当的方法来减少容量时(就您在标准中阅读的内容而言),您不能指望pop_back()
这样做。