c++ 你能在恒定时间内截断std::vector< int>吗?

xe55xuns  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(346)

有几种方法可以使向量为空,包括

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标准库的信息当然也会很有趣。

x3naxklr

x3naxklr1#

example.clear();

clear为:
与容器的大小(即元素的数量)成线性关系。

example.resize(0);

resize
当前大小和计数之间的差异呈线性。如果容量小于计数,则可能由于重新分配而增加复杂性

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

erase
线性:调用T的析构函数的次数等于被擦除元素的个数,调用T的赋值运算符的次数等于被擦除元素后向量中元素的个数
我不知道为什么clearresize都没有提到对析构函数的依赖。int只有一个伪析构函数(这使得在int上调用析构函数有效,但它不做任何事情)。
如果元素有析构函数,那么复杂性是线性的。对于int,编译器可能足够聪明,可以在常量时间内完成。当你不确定运行时,你可以分析运行,或者直接读取反汇编代码。

vwoqyblh

vwoqyblh2#

example.clear();可能会更快,上面所有的例子都带参数,这意味着会生成额外的代码来将它们传递给函数,而函数将需要执行。
然而,重要的是要记住,C++编译器是相当聪明的,可能能够将example.resize(0);转换为example.clear();,但实际上并非如此,所以如果不难的话,最好帮助编译器。

相关问题