c ++高效的数据结构,用于覆盖数据?

时间:2012-06-27 16:01:46

标签: c++ algorithm

我想要一些容器,我可以非常有效地附加可变数量的元素,但能够触发一些东西,所以我可以从头开始覆盖。使用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所以这不起作用......我可以用什么代替呢?

即使我有一个简单的析构函数,BTW向量清除似乎也不是恒定的时间:

randNumber

2 个答案:

答案 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.
 */