1

std::vector<T>::const_iterator呼び出されたbegin と呼び出された endを取る関数がある場合、std::vector<T>::const_iteratorそれを逆方向に繰り返すことは可能ですか?

アップデート

次のような関数シグネチャを変更できません。

void func(Foo::const_iterator begin, Foo::const_iterator end) 
{
   ...
}

そして次のように呼び出します:

func(foo.begin(), foo.end());

私も変えられない

4

3 に答える 3

5

はい、できます。

template <typename Foo>
void test(typename Foo::const_iterator begin,
          typename Foo::const_iterator end)
{
  std::reverse_iterator<typename Foo::const_iterator>
    rbegin(end),
    rend(begin);
  std::copy(rbegin, rend, std::ostream_iterator<typename std::iterator_traits<typename Foo::const_iterator>::value_type>(std::cout));
}

int main()
{
  std::vector<int> v{3,1,4,1,5,9,2,6};
  test<std::vector<int> >(v.begin(), v.end());
}
于 2012-11-21T16:06:48.250 に答える
3

私は質問を誤解しているかもしれませんが、あなたはただ必要ですか:

while (begin != end) {
    --end;
    // do something with *end
}

逆方向のイテレータが必要な場合は、ipc の回答でそれが得られます。

実際には、vectorおそらく を回避できますがwhile (begin != end--)、誘惑されないでください。イテレータがベクトルの先頭にある場合 (つまり、 の結果と等しい場合vector::begin()) にイテレータをデクリメントするのは、未定義の動作です。

このコードには、少なくとも BidirectionalIterator が必要です。幸いなことに、vectorさらに優れた RandomAccessIterator があります。

本当に ForwardIterator しかない場合は、範囲を反復処理し、反復子の値をどこかに ( a のようにstack) 格納してから、それらを逆の順序で使用する必要があります。

std::stack<Foo::const_iterator> iterators;
while (begin != end) {
    iterators.push(begin);
    ++begin;
}
while (!iterators.empty()) {
    Foo::const_iterator i = iterators.top();
    // do something with *i
    iterators.pop();
}

このコードには、少なくとも ForwardIterator が必要です (単なる InputIterator では機能しません)。

于 2012-11-21T16:07:29.623 に答える
2

はい、ご利用いただけますstd::reverse_iterator。イテレータの型を明示的に指定しないことも良い考えです。代わりにテンプレート引数を使用してください。

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

template <typename BidirectionalIterator>
void x(BidirectionalIterator b, BidirectionalIterator e) {
  std::reverse_iterator<BidirectionalIterator> rb(e), re(b);
  std::for_each(rb, re, 
                [](typename BidirectionalIterator::reference x) 
                { std::cout << x << std::endl;});
}

int main()
{
  std::vector<int> v{1,2,3,4};
  x(begin(v), end(v));
  return 0;
}
于 2012-11-21T16:12:04.667 に答える