我发现自己经常在矢量矢量上循环:
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循环?
是否有语言对“嵌套循环”具有“内置”支持?
提前致谢,
有人
答案 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模式。
答案 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)
我认为嵌套循环就像你向我们展示的那样并不是那么糟糕。
我建议为控制变量选择更好的名称。如果没有更好的名字,可以使用outerIndex
和innerIndex
吗?
此外,有时将(复杂)循环体移动到函数中可提高可读性。
答案 4 :(得分:0)
没有'内置'支持向量循环,但如果做得好,智能编译器可能会将for循环优化为代码,这可能会利用高级CPU功能,这可能会提高性能。
一般来说,嵌套循环没有错。但通常情况下,当您使用嵌套循环时,可以优化该代码以便更快地运行。但这在很大程度上取决于循环内部的代码,即你试图用向量中的数据做的事情。
正如其他人所指出的,使用迭代器可以在遵守C ++最佳实践方面改进代码。它不会提高性能,但它会提高类型安全性,编译器可能会向您指出错误,您和编译器都可能没有注意到这些错误。
如果你在循环中做的事情非常简单 - 比如,如果满足条件就增加一个值,那么可以使用标准C ++算法,如std::for_each
和谓词来制作代码更简洁,更易读。
但是不要被这些东西带走,保持简单。 ;)