2

逆参照の結果ではなく、イテレータを直接渡す std::for_each のような関数はありますか?

私たちが持っているもの

std::vector<int> ints;
std::for_each(ints.begin(), ints.end(),
[](int i)
{
  //how to get the iterator of this element???
}

私が探しているもの

for_each_iterator(ints.begin(), ints.end(),
[](const std::vector<int>::const_iterator &i)
{
  //we know the iterator here
}

もちろん、そのような関数を書くのはかなり簡単ですが、 からの標準的な解決策が存在するかどうかを尋ねていstd::ますstd::tr1::boost::

4

3 に答える 3

4

あなたは間違ったレベルの抽象化を見ています。for_eachアルゴリズムは、範囲内の各要素に関数を適用ます。イテレータを操作する必要がある場合は、ループを展開する必要があります。

for (auto it = ints.begin(); it != ints.end(); ++it ) {
   // do something
}

あなたが求めているものは簡単に実行可能ですが、私の意見ではそれほど有用ではありません。イテレータがループ内でどのように更新されるかを制御するか(上記のコードのように)、イテレータ自体はほとんど使用されません。イテレータから何を取得したいですか?

于 2013-02-04T19:34:05.827 に答える
3

標準ライブラリにはそのようなものはありません。しかし、それを自分で実装するのはそれほど難しくありません。

template<typename It, typename Functor >
void iterate(It begin, It end, Functor && f)
{
    while ( begin != end ) { f(begin); ++begin; }
}

そしてそれを次のように使用します:

iterate(ints.begin(), ints.end(), [](std::vector<int>::iterator it)
              {
                 //use it
              });

または、手動ループを使用します。

于 2013-02-04T19:34:58.723 に答える
1

イテレータにラッパーを使用する方法しか考えられません。標準アルゴリズムのみを使用する方法は考えられないため、補助コードを作成する必要があります。例:

#include <algorithm>
#include <vector>
#include <iostream>

template<typename T>
struct it_wrapper {
   it_wrapper(const T& t) : it(t) { }

   T operator*() const {
      return it;
   }

   it_wrapper& operator++() {
      ++it;
      return *this;
   }

   it_wrapper operator++(int) {
      it_wrapper old = *this;
      ++it;
      return old;
   }

   bool operator!=(const it_wrapper& rhs) {
      return it != rhs.it;
   }

   T it;
};

template<typename T>
it_wrapper<T> wrap(const T& t) {
   return it_wrapper<T>(t);
}

int main() {
   std::vector<int> v { 1, 2, 3, 4 };

   std::for_each(wrap(v.begin()), wrap(v.end()), [](decltype(v.begin()) i) {
      std::cout << *i << '\n';
   });
}

版画

1

2

3

4

-loopを使用するよりもこれがどのように役立つかはわかりforませんが、理由が必要です...

于 2013-02-04T19:41:57.650 に答える