繁体   English   中英

你能截断 std::vector<int> 在恒定的时间?</int>

[英]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);

resize

当前大小和计数之间的差异呈线性。 如果容量小于计数,则重新分配可能会导致额外的复杂性

example.erase(example::begin(), example::end());

erase

线性:调用T的析构函数的次数与被擦除的元素个数相同,T的赋值运算符被调用的次数等于vector中被擦除元素之后的元素个数

我不确定为什么clearresize都没有提到对析构函数的依赖。 int只有一个伪析构函数(使对int有效调用析构函数的东西,但它什么都不做)。

如果元素确实具有析构函数,则复杂性是线性的。 对于int ,编译器可能足够聪明,可以在恒定时间内完成。 当您不确定运行时间时,您可以分析运行情况,或直接阅读反汇编代码。

example.clear(); 可能会更快。 以上所有示例都采用 arguments,这意味着将生成额外的代码将它们传递给需要执行的 function。

但是,重要的是要记住 C++ 编译器非常聪明,可能能够将example.resize(0); 进入example.clear(); . 但事实并非如此。 因此,如果不困难,最好帮助编译器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM