gpt4 book ai didi

c++ - 我们可以依赖减少容量的技巧吗?

转载 作者:可可西里 更新时间:2023-11-01 17:37:24 26 4
gpt4 key购买 nike

是否真的可以保证以下减少容量的技巧在任何地方都“有效”?

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

string(s).swap(s); // ?
}

它似乎对我“不起作用”(因为容量保持非零),而且我在标准中找不到任何比“内容”必须在两个 [这里,相同的] 对象。

类似地,对于序列容器:

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

vector<int>(v).swap(v); // ?
}

据我所知,这个“技巧”被半广泛使用;也许这种广泛采用被误导了?

(当然,在 C++11 中,我们有 shr​​ink_to_fit [虽然没有约束力],但这种做法没有实际意义。)

最佳答案

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

§ 23.2.1\8 说:

The expression a.swap(b), for containers a and b of a standard container type other than array, shall exchange the values of a and b without invoking any move, copy, or swap operations on the individual container elements...

这保证必须交换 vector 的内部指针。
但是,我找不到任何可以保证新创建的 vector 容量的内容。

§ 21.4.2\1 说 basic_string 默认构造函数的后置条件之一是 capacity() 返回一个未指定的值。
§ 21.4.2\3 说 basic_string 复制构造函数的后置条件之一是 capacity() 返回的值至少与 size() 一样大。
§ 21.4.6.8\2 说 string::swap 在恒定时间内运行,这(有效地)要求交换内部指针。

据我所知,符合规范的实现可能有 string::max_size() { return 4;},因此将所有内部结构从一个缓冲区交换到另一个缓冲区将是常数时间。 (虽然 vector 不能这样做)

显然,对这一切持保留态度。我引用的是 2011 年 2 月 28 日的 C++ 草案,但我找不到 vector 的复制构造函数的规范。此外,没有找到支持的证据与找到反对的证据是不一样的。

关于c++ - 我们可以依赖减少容量的技巧吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7829018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com