6

C ++でイテレータを使用するための、よりきれいで冗長でない方法はありますか? 私が見たチュートリアルから、どこでも typedef をセットアップします (これは、多くの 1 回限りの for ループに対して行うのが面倒になります)。

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

または、次のような冗長な for ループがあります。

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

アルゴリズムは、その特定の問題を回避します。
特に新しいラムダ関数では。

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

またはラムダで:

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」のベクトルは、「BlahVector」ではなく「Blahs」(複数形) と呼ばれることに注意してください。これは、特定のコンテナーが問題にならないためです。

于 2011-08-16T10:23:57.920 に答える
0

1 つの可能性は、ループ (または反復子を使用する任意のコード) を独自の小さな汎用アルゴリズムに書き込むことです。テンプレートにすることで、コンパイラはイテレータの型を自動的に推測できます。

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をループするには、標準のGCC拡張であることにforall(it, c) foo(it);注意してください。typeof

于 2011-08-16T02:53:39.783 に答える