6

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

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

或有冗长的寻找循环,如:

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

有没有更好的办法?

4

7 回答 7

8

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

for (auto& it : v) ...
于 2011-08-16T05:52:37.500 回答
4

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

typedef pair<int, int> tElem;
BOOST_FOREACH( tElem e, aVector )
{
    cout << e.first << " " << e.second << '\n';
}
于 2011-08-16T02:45:00.500 回答
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 替换所有循环的陷阱。有一大堆算法使用迭代器,允许您根据容器的内容进行操作或执行操作。

于 2011-08-16T02:42:24.977 回答
2

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

for (auto i = v.begin(); i != v.end(); ++i) {}
于 2011-08-16T02:54:17.480 回答
1

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

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

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

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

于 2011-08-16T10:23:57.920 回答
0

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

template <class T>
do_something(T begin, T end) { 
    for (T pos = begin; pos != end; ++pos) 
        do_something_with(*pos);
}
于 2011-08-16T05:33:58.290 回答
-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 扩展。

于 2011-08-16T02:53:39.783 回答