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

is there prettier syntax for a c++ iterator?

本文关键字:语法 更好 迭代器 c++      更新时间:2023-10-16

在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) ...

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

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

算法在某种程度上解决了这个问题。
特别是使用新的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扩展到标准。