2

最新のC++では、各要素の値のみが必要な場合に文字列やベクトルなどのシーケンシャルコレクションを反復処理するためのイディオムは短くエレガントです。

for (auto x: xs)

インデックスも必要な場合は、少しエレガントではありません。

for (size_t i = 0; i != xs.size() ++i)

...私がまだ追いついていない最近の開発がない限り。C ++ 11には後者を行うための好ましい方法がありますか、それとも上記はそれでもうまくいきますか?

4

3 に答える 3

2

Range-Based for loopsRange-Based for Loops 範囲の概念をサポートするすべての型に有効です。与えられた型 T のオブジェクト objbegin(obj)end(obj)有効です。内容:

  • すべての C++11 ライブラリ コンテナー。
  • 配列と valarray。
  • 初期化リスト。
  • 正規表現一致。
  • begin(T) と end(T) が適切な反復子を生成する任意の UDT (ユーザー定義型) T。
于 2013-01-19T06:03:33.387 に答える
1

推奨される慣用的な方法は、単純な for ループです。

別の方法として、整数範囲を使用する方法があります。

template<typename C>
auto container_index(C const& container) -> decltype(boost::irange(0, container.size())) {
  return boost::irange(0, container.size());
}

for(auto x : container_index(xs))

または反復関数:

template<typename F>
void index_iterate(std::size_t size, F func) {
  for(std::size_t i = 0; i != size; ++i) {
    func(i);
  }
}

index_iterate(container.size(), [&](std::size_t i){ /* ... */ });

ただし、可能な限り単純なループを使用してください。それは私の意見では優れています。

于 2013-01-19T05:52:35.847 に答える
0

次の 2 つの方法を組み合わせることができます。

int i = 0;
for ( auto x : v ) {
    // do smth with x or v[i] or i
    i++;
}
于 2013-01-19T06:28:10.923 に答える