【发布时间】:2022-12-14 12:55:22
【问题描述】:
有几种方法可以使向量为空,包括
std::vector<int> example = makeMyReallyBigVector();
example.clear();
example.resize(0);
example.erase(example::being(), example::end());
// any other method which would be relevant
C++ 标准中是否有关于哪个最有效、时间最明智的保证?内容是没有析构函数的原始数据类型。我特别关心的是,我不希望向量容量发生变化,我只希望它的内部“已用大小”设置为 0,而不触及现在已删除的内容。
我想要的是在恒定时间内将 int 向量大小设置为 0,而不释放任何内存。这在 C++ 标准中可行吗?
如果 C++ 标准不提供任何保证,我正在使用 GNU C++ 标准库,那么如果标准不提供任何保证,那是否提供任何保证?为了便于移植,在这种情况下,当然也会对有关 Clang 和 Microsoft 标准库的信息感兴趣。
【问题讨论】:
-
在您的情况下,所有这三种方法最终都会做同样的事情,因此请使用您想要的任何一种。
-
您可以随时检查生成的机器代码。例如,在这个现场演示中,这三种情况几乎相同:godbolt.org/z/c6r4haofY。
-
@LouisGo 理论上是的。实际上,如果值类型的销毁操作实际上是空操作,那么它可以优化为 O(1) 机器代码。
-
@hyde——好点。这就是为什么我强调永远不要编写一个空的析构函数,而只是将其省略或声明它
=default。编写一个空的析构函数会改变类的特征,如果存储在向量中的类型的特征不是平凡可破坏的,那么您所说的优化可能不会发生。 -
@Raildex 调整大小不会减少容量。