c ++迭代器有更漂亮的语法吗?

时间:2011-08-16 02:35:21

标签: c++ iterator design-patterns syntactic-sugar

在C ++中使用迭代器是否有更漂亮/更简洁的方法?从我看过的教程中,我要么在任何地方都设置了typedef(对于很多一次性for循环来说这很麻烦):

typedef std::vector<std:pair<int, int> >::iterator BlahIterator;

或者有详细的循环,如:

for (std::vector<std:pair<int, int> >::iterator it = ... ) ...

有更好的方法吗?

7 个答案:

答案 0 :(得分:7)

在C ++ 11中,您可以使用基于范围的for循环和auto关键字:

for (auto& it : v) ...

答案 1 :(得分:4)

使用boost,您可以使用FOR_EACH宏。

typedef pair<int, int> tElem;
BOOST_FOREACH( tElem e, aVector )
{
    cout << e.first << " " << e.second << '\n';
}

答案 2 :(得分:2)

算法可以解决这个特定的问题 特别是新的lambda函数。

std::for_each(c.begin(), c.end(), Action()); /* Where Action is your functor */

或者使用lambda:

std::for_each(c.begin(), c.end(), [](type const& e) { /* Stuff */ });

注意:不要陷入使用std :: for_each替换所有循环的陷阱。有许多算法使用迭代器,允许您根据容器的内容操作或执行操作。

答案 3 :(得分:2)

使用c ++ 0x,您可以使用auto关键字:

for (auto i = v.begin(); i != v.end(); ++i) {}

答案 4 :(得分:1)

我通常使用以下命名模式:

typedef std::pair<int, int> Blah;
typedef std::vector<Blah> Blahs;

然后使用Blahs::iterator,即我没有命名迭代器而是容器(通常包含在容器中)。
typedef是一种非常有用的抽象机制。

请注意,“Blah”的矢量称为“Blahs”(即只是复数),而不是“BlahVector”,因为特定容器无关紧要。

答案 5 :(得分:0)

一种可能性是将循环(或任何使用迭代器的代码)编写到自己的小型通用算法中。通过使其成为模板,编译器可以/将自动推导出迭代器类型:

template <class T>
do_something(T begin, T end) { 
    for (T pos = begin; pos != end; ++pos) 
        do_something_with(*pos);
}

答案 6 :(得分:-2)

我通常会定义这个,虽然我被告知我会为此而痛苦:

#define forsn(i, s, n) for(int i = (s); i < (n); ++i)
#define forn(i, n) forsn(i, 0, n)
#define forall(it, g) for(typeof g.begin() it = g.begin(); it != g.end(); ++it)

然后,从0到n循环,一个常见任务,我说forn(i, n) foo(i);,并循环任何标准容器c,我说forall(it, c) foo(it);请注意typeof是GCC扩展到标准。