我想要一些容器,我可以非常有效地附加可变数量的元素,但能够触发一些东西,所以我可以从头开始覆盖。使用std::list
,它看起来像这样:
while(whatever)
{
for(int i = 0; i < randNumber; ++i)
list.push_back( foo() );
//now want to reset
list.clear();
}
问题是list.clear()
是线性时间,而我真的只想回到开头并从那里开始覆盖......我尝试使用vector[index++] = foo()
向量并用{替换clear {1}}但你无法预测index = 0
所以这不起作用......我可以用什么代替呢?
randNumber
答案 0 :(得分:2)
只需在代码中替换std::list
std::vector
即可。 push_back
会根据需要增加大小,clear
将从容器中删除所有元素。注意:std::vector<>::clear()
占用容器大小的线性时间,但操作是对存储元素的破坏(如果它们有非平凡的析构函数),无论如何都需要这样做。对于具有普通析构函数的类型,std::vector<>::clear()
表现为常量时间操作。
答案 1 :(得分:0)
你有randNumber
的上限吗?如果是这样,您可以使用std::vector::reserve()
加快速度。这样,您可以在O(1)中追加并在O(1)中删除。
请注意!如果向量包含具有非平凡析构函数的数据类型,则clear
采用O(n)。但是,如果析构函数很简单,clear
需要O(1)。
来自stl_constructor.h的评论:
/**
* Destroy a range of objects. If the value_type of the object has
* a trivial destructor, the compiler should optimize all of this
* away, otherwise the objects' destructors must be invoked.
*/