我们可以依靠减少容量的技巧吗?

Lig*_*ica 8 c++ std

它实际上是否保证以下减少容量技巧将"起作用"?

int main() {
   std::string s = "lololololol";
   s = "";                        // capacity still non-zero

   string(s).swap(s);             // ?
}
Run Code Online (Sandbox Code Playgroud)

它对我来说似乎没有"起作用"(因为容量仍然不为零),而且我在标准中找不到任何东西,而不是"内容"必须在两者之间交换[这里,相同的]对象.

同样,对于序列容器:

int main() {
   vector<int> v { 1,2,3,4,5 };
   v.clear();                   // capacity still non-zero

   vector<int>(v).swap(v);      // ?
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这个"技巧"是半广泛使用的; 也许这种广泛采用是错误的?

(当然,在C++ 11中,我们shrink_to_fit[虽然没有绑定],但是这种做法没有实际意义.)

Moo*_*uck 6

我一直被告知,没有保证降低容量的标准方法.所有方法都已经(现在仍然是)实现定义.

§23.2.1\ 8说:

a.swap(b)对于容器ab除标准容器类型之外的表达式,array应交换ab 调用各个容器元素上的任何移动,复制或交换操作的值...

这保证了必须交换向量的内部指针.
但是,我找不到任何保证新创建的矢量容量的东西.

§21.4.2\ 1表示basic_string默认构造函数的一个post条件是capacity()返回一个未指定的值.
§21.4.2\ 3表示其中一个basic_string复制构造函数的post条件是capacity()返回一个至少与之相同的值size().
§21.4.6.8\ 2表示string::swap在恒定时间内运行,它(有效地)要求交换内部指针.

据我所知,符合要求的实现可以具有string::max_size() { return 4;},并且将所有内部构件从一个缓冲区交换到另一个缓冲区因此将是恒定时间.(虽然矢量不能这样做)

显然,把这一切都拿出一粒盐.我引用了2011年2月28日的C++草案,我找不到向量的复制构造函数的规范.此外,没有找到证据是不一样的寻找证据反对.