你是对的,大部分情况下。
只有几种方法可以减少std::vector 的容量……
移动作业
#include <iostream>
#include <vector>
int
main()
{
std::vector<int> v1(10);
std::vector<int> v2(20);
std::cout << "v2.capacity() = " << v2.capacity() << '\n';
std::cout << "Move assign v2 with less capacity\n";
v2 = std::move(v1);
std::cout << "v2.capacity() = " << v2.capacity() << '\n';
}
应该输出:
v2.capacity() = 20
Move assign v2 with less capacity
v2.capacity() = 10
如果涉及的分配器以某种方式设置,则无法保证容量减少。但在如上所示的常见情况下,容量会缩小。如果您真的想了解在移动分配期间容量如何不会减少的细节,请再问一个问题,我可以详细研究。
shrink_to_fit
#include <iostream>
#include <vector>
int
main()
{
std::vector<int> v(20);
std::cout << "v.capacity() = " << v.capacity() << '\n';
std::cout << "erasing...\n";
v.erase(v.begin() + v.size()/2, v.end());
std::cout << "v.capacity() = " << v.capacity() << '\n';
std::cout << "shrink_to_fit...\n";
v.shrink_to_fit();
std::cout << "v.capacity() = " << v.capacity() << '\n';
}
这将可能输出:
v.capacity() = 20
erasing...
v.capacity() = 20
shrink_to_fit...
v.capacity() = 10
但允许输出:
v.capacity() = 20
erasing...
v.capacity() = 20
shrink_to_fit...
v.capacity() = 20
交换
#include <iostream>
#include <vector>
int
main()
{
std::vector<int> v(20);
std::vector<int> v2(10);
std::cout << "v.capacity() = " << v.capacity() << '\n';
std::cout << "swap...\n";
swap(v, v2);
std::cout << "v.capacity() = " << v.capacity() << '\n';
}
应该输出:
v.capacity() = 20
swap...
v.capacity() = 10
我知道没有其他方法可以缩小vector 的容量(除了明显等效的结构,例如v.swap(v2))。
一个好的经验法则是向量的容量永远不会缩小,除非:
- 它使用另一个向量传输资源(例如移动分配或
swap)。
-
shrink_to_fit 被调用。
哦,我差点忘记了第三种可能性:任何时候你从 vector 移动,从vector 移动的容量可能会减少(或者可能不会)。它是未指定的,所以你不能指望它。一般来说,移动的值应该是你不关心它们当前状态的变量。您随后将破坏它们或为其分配一个新的已知状态(分配不必通过赋值运算符;例如可以是clear(),后跟push_back())。