【问题标题】:What does the standard say about how calling clear on a vector changes the capacity?关于在向量上调用 clear 如何改变容量的标准说明了什么?
【发布时间】:2013-08-30 07:54:50
【问题描述】:

本网站暗示清除向量可能会改变容量:

http://en.cppreference.com/w/cpp/container/vector/clear

许多实现在调用后不会释放分配的内存 清除(),有效地留下向量的容量() 不变。

但根据@JamesKanze 的说法,这是错误的,明确的标准要求不会改变容量。

标准是怎么说的?

【问题讨论】:

  • +1 其他人可能会遇到这个问题并感到困惑,这是个好问题。
  • en.cppreference.com/w/cpp/container/vector/clear 已更新以反映以下@JamesKanze 的回答。
  • 我遇到了同样的问题并且完全感到困惑,因为cplusplusclear 做了一个奇怪的陈述:“......并且向量容量不能保证改变”,我将其解释为:它可能会改变,但不能保证它会改变。

标签: c++ vector language-lawyer


【解决方案1】:

根据您正在查看的标准版本, clear 被定义为 erase(begin(), end()) 的等价物,或者(在 C++11 中):
"销毁 a 中的所有元素。使所有元素无效 引用、指针和迭代器 a 和的元素可能会使 结束迭代器。”

在这两种情况下都不允许修改 容量;以下代码由以下代码保证安全 标准:

std::vector<int> v;
for (int i = 0; i != 5; ++ i) {
    v.push_back(i);
}
assert(v.capacity() >= 5);
v.clear();
assert(v.capacity() >= 5);
v.push_back(10);
v.push_back(11);
std::vector<int>::iterator i = v.begin() + 1;
v.push_back(12);
v.push_back(13);
*i = 42;        //  i must still be valid, because none of 
                //  the push_back would have required an
                //  increase of capacity

(C++11中措辞改变的原因:委员会 不想为clear 要求MoveAssignable,这将 如果它是根据erase 定义的。)

【讨论】:

  • @NeilKirk:如果容量发生变化,那么它将破坏reserve 提供的保证:“保证在调用reserve() 后发生的插入期间不会发生重新分配直到插入会使向量的大小大于 capacity() 的值时@"
  • @jrok 解除分配也不会发生,因此将容量更改为 0 不会损害该要求。
  • @MikeSeymour:说“Of course clear() isn't an insertion; but insertions after clear() are still subject to the guarantee, so clear() can't reduce the capacity.”,这是否意味着即使复制/移动分配也不能减少容量(我会对此感到非常惊讶)?
  • @MikeSeymour:我认为保证中提到的capacity()应该是插入操作时capacity()的值,而不是@987654334之后的capacity()的值@ 称呼。因此,如果允许clear() 缩小容量,则保证不会失效。 clear()是否允许收缩容量是另一个问题,我只是说你在这里使用的理由不合适。
  • @JamesKanze:如果我们将no additional observable behavior other than specified 规则(我完全同意)应用于向量的复制/移动分配,我们是否可以得出不允许复制/移动分配减少的结论?矢量的容量呢?这似乎很不合理。这里出了什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
相关资源
最近更新 更多