如何简化嵌套循环?

时间:2010-12-14 09:13:16

标签: c++ programming-languages

我发现自己经常在矢量矢量上循环:

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循环?

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

提前致谢,

有人

5 个答案:

答案 0 :(得分: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 :(得分:1)

我认为你要找的是Iterator模式。

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

答案 2 :(得分: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> >());

答案 3 :(得分:1)

我认为嵌套循环就像你向我们展示的那样并不是那么糟糕。 我建议为控制变量选择更好的名称。如果没有更好的名字,可以使用outerIndexinnerIndex吗? 此外,有时将(复杂)循环体移动到函数中可提高可读性。

答案 4 :(得分:0)

没有'内置'支持向量循环,但如果做得好,智能编译器可能会将for循环优化为代码,这可能会利用高级CPU功能,这可能会提高性能。

一般来说,嵌套循环没有错。但通常情况下,当您使用嵌套循环时,可以优化该代码以便更快地运行。但这在很大程度上取决于循环内部的代码,即你试图用向量中的数据做的事情。

正如其他人所指出的,使用迭代器可以在遵守C ++最佳实践方面改进代码。它不会提高性能,但它会提高类型安全性,编译器可能会向您指出错误,您和编译器都可能没有注意到这些错误。

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

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