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

发布于 2024-11-29 11:44:19 字数 329 浏览 1 评论 0原文

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

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

或者有冗长的 for 循环,例如:

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

有更好的方法吗?

Is there a prettier / less-verbose way to use iterators in C++? From the tutorials I've seen, I either set up typedefs everywhere (which gets tedious to do for a lot of one-off for-loops):

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

or have verbose-looking for loops like:

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

Is there a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

半枫 2024-12-06 11:44:20

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

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

With c++0x you can use the auto keyword:

for (auto i = v.begin(); i != v.end(); ++i) {}
貪欢 2024-12-06 11:44:20

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

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

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

请注意,“Blah”向量称为“Blahs”(即复数),而不是“BlahVector”,因为特定容器并不重要。

I usually use the following naming pattern:

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

and then use Blahs::iterator, i.e I don't name the iterator but the container (and usually the thing contained in it).
typedef is a very useful abstraction mechanism.

Note that a vector of "Blah" is called "Blahs" (i.e. just the plural), not a "BlahVector", because the specific container doesn't matter.

你又不是我 2024-12-06 11:44:20

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

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

One possibility is to write your loop (or whatever code that uses the iterator) into a small generic algorithm of its own. By making it a template, the compiler can/will deduce the iterator type automatically:

template <class T>
do_something(T begin, T end) { 
    for (T pos = begin; pos != end; ++pos) 
        do_something_with(*pos);
}
孤者何惧 2024-12-06 11:44:20

我通常会定义这个,尽管有人告诉我我会为此下地狱:

#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);< /code>,并循环任何标准容器 c,我说 forall(it, c) foo(it); 请注意 typeof 是标准的 GCC 扩展。

I usually define this, though I've been told I'm going to hell for it:

#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)

Then, to loop from 0 to n, a common task, I say forn(i, n) foo(i);, and to loop any standard container c, I say forall(it, c) foo(it); Do note that typeof is a GCC extension to the standard.

酒解孤独 2024-12-06 11:44:19

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

for (auto& it : v) ...

In C++11 you can use the range-based for loop combined with the auto keyword:

for (auto& it : v) ...
心作怪 2024-12-06 11:44:19

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

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

With boost, you can use the FOR_EACH macro.

typedef pair<int, int> tElem;
BOOST_FOREACH( tElem e, aVector )
{
    cout << e.first << " " << e.second << '\n';
}
溺深海 2024-12-06 11:44:19

这些算法在某种程度上解决了这个特定问题。
尤其是新的 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 替换所有循环的陷阱。有一大堆使用迭代器的算法,允许您根据容器的内容进行操作或执行操作。

The algorithms sort of get around that particular problem.
Especially with the new lambda functions.

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

Or with lambda:

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

Note: don't fall into the trap of using std::for_each to replace all loops. There are a whole bunch of algorithms that use iterators that allow you to manipulate or do operations based on the contents of a container.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文