我从矢量中提取min。
假设vector = [0,inf,inf,inf];
ExtractSmallest(vector) = 0;
然后vector = [0,1,inf,inf];
但现在,我们已经看到了0.因此,
ExtractSmallest(vector) = 1;
我通过nodes.erase(nodes.begin() + smallestPosition);
但是,我现在意识到擦除非常糟糕。有没有办法实现这个没有擦除向量?只是跳过我们已经看过的那些?
Node* CGraph::ExtractSmallest(vector<Node*>& nodes)
{
int size = nodes.size();
if (size == 0) return NULL;
int smallestPosition = 0;
Node* smallest = nodes.at(0);
for (int i=1; i<size; ++i)
{
Node* current = nodes.at(i);
if (current->distanceFromStart <
smallest->distanceFromStart)
{
smallest = current;
smallestPosition = i;
}
}
nodes.erase(nodes.begin() + smallestPosition);
return smallest;
}
答案 0 :(得分:1)
选项1 您可以在其上并行迭代vector<bool>
。找到最小元素后,将bool
向量中的该位置标记为true
。无论何时迭代,都要跳过标记为true
的两个向量中的位置。
选项2 如果订单不重要,请保留目前已删除的元素数量。找到最小值时,使用第一个非排除元素交换位置。在新的迭代中,从第一个非排除元素开始。
选项3 如果订单不重要,请对数组进行排序。 (这需要O(n*log(n))
)。删除现在将O(1)
- 您只需排除第一个未排除的元素。
选项4 如果没有重复项,您可以将std::set
与所有排除的元素保持在一起。迭代时,检查当前元素是否已被排除。