2015-09-27 63 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(); 
}