3

このことを考慮 -

#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <list>

int main()
{
  typedef std::list<int> L;
  L l(5);
  typedef L::const_iterator CI;
  typedef L::iterator I;
  CI cb = l.begin(), ce = l.end();
  I b = l.begin();
  std::transform(cb, --ce, ++b, std::bind2nd(std::plus<CI::value_type>(), 1));
  std::copy(l.begin(), l.end(), std::ostream_iterator<CI::value_type>(std::cout\
));
  std::cout<<std::endl;
  return 0;
}

私によると、変換はリストの最初から「最後から2番目」の要素まで反復し、各要素に1を追加し、「2番目」から「最後」の要素に上書きするため、その出力は01111になるはずです。

しかし、驚いたことに、出力は 01234 です

何が欠けていますか?cppreference の transform のドキュメントを読みました

4

2 に答える 2

3

で同じコンテナに要素を追加し始めているため++b、オフセットが 1 つずれています。これは、要素iをプラス1して位置に挿入することを意味しますi+1。したがって、移動するにつれて合計が累積されます。transform が要素を順番に処理すると仮定すると、これが最初の 3 回の反復で行われることになります。

0 0 0 0 0

0の位置に1を足して、1の位置に入れる

0 1 0 0 0

1の位置に1を足して2の位置に入れる

0 1 2 0 0

2の位置に1を足して3の位置に入れる

0 1 2 3 0

于 2013-06-26T13:46:16.750 に答える