提取最小的向量

时间:2012-06-07 07:50:36

标签: vector min erase

我从矢量中提取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;


}

1 个答案:

答案 0 :(得分:1)

选项1 您可以在其上并行迭代vector<bool>。找到最小元素后,将bool向量中的该位置标记为true。无论何时迭代,都要跳过标记为true的两个向量中的位置。

选项2 如果订单不重要,请保留目前已删除的元素数量。找到最小值时,使用第一个非排除元素交换位置。在新的迭代中,从第一个非排除元素开始。

选项3 如果订单不重要,请对数组进行排序。 (这需要O(n*log(n)))。删除现在将O(1) - 您只需排除第一个未排除的元素。

选项4 如果没有重复项,您可以将std::set与所有排除的元素保持在一起。迭代时,检查当前元素是否已被排除。