2015-09-27 66 views
1

假設我在這樣的方式限定的曲線圖,循環通過經由迭代器C中的陣列++

unordered_map<int, unordered_set<int>> graph = { 
    { 0, { 1, 2, 3 } }, 
    { 1, { 3, 4, 5 } }, 
    { 2, { 6, 5, 4 } } 
}; 

我要清空散列集圖表中的每個條目的。我在這裏做兩個選項,

A. for(auto v = graph.begin(); v != graph.end(); ++v) v->second.clear(); 

B. for(auto v : graph) v.second.clear(); 

我看到一個作品,但B沒有。我不太明白。我的理論是,B在做的方式,v是實際元素的副本。所以它不能清除實際的散列集合。

需要幫助。謝謝!

回答

4

我的理論是,B的方式在做,v是實際元素

你的理論是正確的副本。

由於要修改原來的,迭代與基準,而不是一個副本:

for(auto& v : graph) v.second.clear(); 
+0

謝謝,它的工作原理!我還有一個問題。根據我的測試,for(auto&v:graph)的運行時間比(auto v:graph)長。我很困惑。第一種方法不需要複製圖形,v只是一個參考。對我來說更有意義的是第二個跑得更長。 – CodingFanSteve

+0

我可能看到更長的時間是由於目前服務器更忙。 – CodingFanSteve

+0

@ CodingForFun15也許編譯器可以推斷清除臨時副本對程序沒有影響,所以它決定完全刪除循環。 – user2079303

0

如果您在Windows平臺上專門的工作和有VS2012或更新這種方法也可以使用。

typedef unordered_map<int, unordered_set<int>> Graph; 

Graph myGraph = { 
    { 0, { 1, 2, 3 } }, 
    { 1, { 3, 4, 5 } }, 
    { 2, { 6, 5, 4 } } 
}; 

for each (Graph& graph in myGraph) { 
    // Do Work Here! 
    graph.second.clear(); 
}