[英]Is `std::vector<primitive>::clear()` a constant time operation?
[英]Can you truncate std::vector<int> in constant time?
有几种方法可以使向量为空,包括
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,而不释放任何 memory。C++ 标准是否可行?
如果 C++ 标准不提供任何保证,我正在使用 GNU C++ 标准库,那么如果标准不提供任何保证? 为了便于携带,在这种情况下,当然也会对有关 Clang 和 Microsoft 标准库的信息感兴趣。
example.clear();
clear
的是:
与容器的大小成线性关系,即元素的数量。
example.resize(0);
当前大小和计数之间的差异呈线性。 如果容量小于计数,则重新分配可能会导致额外的复杂性
example.erase(example::begin(), example::end());
线性:调用T的析构函数的次数与被擦除的元素个数相同,T的赋值运算符被调用的次数等于vector中被擦除元素之后的元素个数
我不确定为什么clear
和resize
都没有提到对析构函数的依赖。 int
只有一个伪析构函数(使对int
有效调用析构函数的东西,但它什么都不做)。
如果元素确实具有析构函数,则复杂性是线性的。 对于int
,编译器可能足够聪明,可以在恒定时间内完成。 当您不确定运行时间时,您可以分析运行情况,或直接阅读反汇编代码。
example.clear();
可能会更快。 以上所有示例都采用 arguments,这意味着将生成额外的代码将它们传递给需要执行的 function。
但是,重要的是要记住 C++ 编译器非常聪明,可能能够将example.resize(0);
进入example.clear();
. 但事实并非如此。 因此,如果不困难,最好帮助编译器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.