在C ++中使用迭代器是否有更漂亮/更简洁的方法?从我看过的教程中,我要么在任何地方都设置了typedef(对于很多一次性for循环来说这很麻烦):
typedef std::vector<std:pair<int, int> >::iterator BlahIterator;
或者有详细的循环,如:
for (std::vector<std:pair<int, int> >::iterator it = ... ) ...
有更好的方法吗?
答案 0 :(得分:7)
在C ++ 11中,您可以使用基于范围的for循环和auto关键字:
for (auto& it : v) ...
答案 1 :(得分:4)
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扩展到标准。