2010-12-14 61 views
1

我发现自己遍历载体的载体很多:如何缓解嵌套循环?

std::vector<std::vector<int> > foo; 

for(unsigned int i=0; i != foo.size(); ++i) { 
for(unsigned int j=0; j != foo[i].size(); ++j) { 
    // use foo[i][j] 
} 
} 

我没有一个很好的小例子,为什么“数据”由INT的向量的向量最能代表但我们不怀疑在这里。

你有什么建议来简化循环?我可以想象一个实现显式循环的函数,并为该实体提供一个指向函数的指针。

如何在更多层次上“生成”嵌套for循环?

是否有语言对“嵌套循环”有“内置”支持?

在此先感谢,

有人

回答

2

我能想到的功能那 实现明确的循环和 需要一个指向函数的 体。

好像访问者模式:

http://en.wikipedia.org/wiki/Visitor_pattern

编辑:

我没有测试模板的一部分,但 是这样的:

class Visitor 
{ 
    public: 
     template<typename T> 
     void visit(const std::vector<T> &vector) 
     { 
      for(typename std::vector<T>::const_iterator it(vector.begin()); 
       it != vector.end(); 
       ++it) 
      { 
       visit(*it); 
      } 
     } 

     void visit(int i) 
     { 
      // do something with i 
     } 
} 


// usage: 
std::vector<std::vector<int> > theData; 

Visitor v; 
v.visit(theData); 
std::cout << v.result() << std::endl; 
1

有没有嵌套结构的内置循环(给定嵌套深度可以是任意的)。你有几个选择。

将2D矢量展平成单维向量并迭代该向量或使用类似for_each的东西,例如,

template <typename T> 
struct do_foo 
{ 
    void operator()(T v) 
    { 
    // Use the v 
    } 
}; 

template <typename Handler, typename Container> 
struct handle_nested 
{ 
    void operator()(Container const& internal) 
    { 
    // inner loop, container type has been abstracted away and the handler type 
    for_each(internal.begin(), internal.end(), Handler()); 
    } 
}; 

// outer loop 
for_each(foo.begin(), foo.end(), handle_nested<do_foo<int>, std::vector<int> >()); 
1

我认为嵌套循环,因为你给我们展示的那个没有那么糟糕。 我会建议为控制变量选择更好的名称。如果没有更好的名字,可以使用outerIndexinnerIndex ?!另外,有时将(复杂)循环体移动到函数中可以提高可读性。

0

对于向量循环没有“内置”支持,但是如果做得对,智能编译器可以优化循环代码,这可能会利用先进的CPU功能,这可能会提高性能。

一般而言,嵌套循环没有任何问题。但通常情况下,当您有嵌套循环时,该代码可能会进行优化以加快运行速度。但是,这很大程度上取决于循环内的代码,即,您正在尝试使用向量中的数据。

正如其他人指出的那样,使用迭代器可以改善您的代码在遵从C++最佳实践方面的表现。它不会提高性能,但它会提高类型安全性,并且编译器可能会向您指出错误,即您或编译器可能没有注意到的其他错误。

如果你在循环内部做的事情非常简单 - 比方说,如果满足条件就递增一个值,那么标准C++算法(如std::for_each)和谓词可以用来使代码更简洁,可读。

但不要被这些东西带走,保持简单。 ;)