[英]Extracting minimum of vector
我正在從向量中提取分鍾。
說向量= [0,inf,inf,inf];
ExtractSmallest(vector) = 0;
然后向量= [0,1,inf,inf];
但現在,我們已經看到了0。因此,
ExtractSmallest(vector) = 1;
我通過執行nodes.erase(nodes.begin() + smallestPosition);
表示此代碼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您可以具有一個額外的vector<bool>
在其上並行進行迭代。 當找到最小元素時,將bool
向量中的該位置標記為true
。 每當您進行迭代時,都跳過兩個向量中標記為true
。
選項2如果順序不重要,請保持到目前為止已刪除元素的數量。 當找到最小值時,請與第一個未排除的元素互換頭寸。 在新的迭代中,從第一個未排除的元素開始。
選項3如果順序不重要,則對數組進行排序。 (這需要O(n*log(n))
)。 現在,刪除將采用O(1)
-您只需排除第一個未排除的元素。
選項4如果沒有重復項,則可以在一側保留std::set
並保留所有排除的元素。 迭代時,請檢查當前元素是否已被排除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.