在 C++ 中使用迭代器是否有更漂亮/更简洁的方式?从我看到的教程中,我要么在任何地方设置 typedef(对于很多一次性的 for 循环来说,这样做很乏味):
typedef std::vector<std:pair<int, int> >::iterator BlahIterator;
或有冗长的寻找循环,如:
for (std::vector<std:pair<int, int> >::iterator it = ... ) ...
有没有更好的办法?
在 C++ 中使用迭代器是否有更漂亮/更简洁的方式?从我看到的教程中,我要么在任何地方设置 typedef(对于很多一次性的 for 循环来说,这样做很乏味):
typedef std::vector<std:pair<int, int> >::iterator BlahIterator;
或有冗长的寻找循环,如:
for (std::vector<std:pair<int, int> >::iterator it = ... ) ...
有没有更好的办法?
在 C++11 中,您可以将基于范围的 for 循环与 auto 关键字结合使用:
for (auto& it : v) ...
算法可以解决这个特定问题。
尤其是新的 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 替换所有循环的陷阱。有一大堆算法使用迭代器,允许您根据容器的内容进行操作或执行操作。
使用 c++0x,您可以使用 auto 关键字:
for (auto i = v.begin(); i != v.end(); ++i) {}
我通常使用以下命名模式:
typedef std::pair<int, int> Blah;
typedef std::vector<Blah> Blahs;
然后使用Blahs::iterator
,即我没有命名迭代器,而是命名容器(通常是其中包含的东西)。
typedef
是一种非常有用的抽象机制。
请注意,“Blah”的向量称为“Blahs”(即只是复数),而不是“BlahVector”,因为具体的容器无关紧要。
一种可能性是将您的循环(或使用迭代器的任何代码)编写成自己的小型通用算法。通过使其成为模板,编译器可以/将自动推断迭代器类型:
template <class T>
do_something(T begin, T end) {
for (T pos = begin; pos != end; ++pos)
do_something_with(*pos);
}
我通常会定义这个,尽管有人告诉我我会为此下地狱:
#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 扩展。