我正在处理一个元素矢量,这些元素需要随机选择并有效地移除,直到满足条件或者直到所有元素都被选中。但是,在代码执行的后期阶段之前,它们实际上不会被删除,所以我需要维护一个有效的可用元素列表。我可以从第二个矢量中删除元素,或者每次都可以重新创建它。请参考下面示出的载体在while循环每次创建的例子我的代码最低版本:C++矢量元素擦除与新矢量创建
Random mRandom; // Pseudo-random number generator
std::vector< Element* > mElements;
for(unsigned index = 0; index < ARBITRARY_VALUE; index++)
mElements.push_back(new Element());
std::vector<bool> removedElements;
bool condition = true;
while(condition == true) {
std::vector<unsigned> availableIndices;
for(unsigned index = 0; index < mElements.size(); index++) {
if(removedElements[ index ] == false)
availableIndices.push_back(index);
}
if(availableIndices.size() > 0) {
unsigned maximum = availableIndices.size() - 1;
unsigned randomIndex = mRandom.GetUniformInt(maximum); // Zero to max
removedElements[ availableIndices[ randomIndex ] ] = true;
Element* element = mElements[ availableIndices[ randomIndex ] ];
condition = element->DoStuff(); // May change condition and exit while
} else
break;
}
很明显,擦除矢量中间的元素需要底层系统进行迭代通过其余的元素并将它们移动到新的有效位置。显然这意味着如果擦除的元素接近矢量的末尾,则意味着更少的迭代。
我已经阅读了一些关于擦除矢量元素的相关费用的帖子,但我还没有看到任何直接解决我的问题的东西。在擦除之后“移动”元素的过程是否会引入开销,从而可以通过创建指向有效元素的新向量来遍历所有元素,从而使其更便宜?正如我在上面的代码示例。
干杯,菲尔
看起来你想'std :: stable_partition'来分割最终被删除的元素。 – PaulMcKenzie
mElements中的顺序是否重要?如果不是,那么你可以简单地用'std :: swap(mElements [randomIndex],mElements [ - cur_size]);'(其中'cur_size'用'mElements.size()'初始化循环)。换句话说,将“已移除”元素移到最后,在进一步处理中忽略它们。如果需要,您可以一次性“擦除”它们。 –