开发者

printing two adjacent values returned from adjacent_find

I want to print the first 2 values where the next is doubled from the current value.

#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;

bool doubled (int x, int y) { return x*2 == y; }

int main()
{
  deque<int> di;
  deque<int>::iterator diiter;

  for (int i=0; i<=10; i+=2) di.insert(di.end(), i);

  for (diiter = di.begin(); diiter != di.end(); ++diiter)
    cout << *diiter << " ";
  cout << endl;

  diiter = adjacent_find(di.begin(), di.end(), doubled);
  if (diiter != di.end()) {
    cout << "found " << *diiter << " at开发者_如何学编程 " << distance(di.begin(), diiter)+1 
         << " and " << *(++diiter) << " at " << distance(di.begin(), diiter)+1 
         << endl;
  }
}

the output is

0 2 4 6 8 10 
found 4 at 3 and 4 at 2

not what I expected, which should be:

0 2 4 6 8 10 
found 2 at 2 and 4 at 3

What's wrong with my code? I don't understand how the second position is decremented from the first one when I actually incremented it. Thanks for all help.


Your program is giving strange results because it does not take in to account the fact, that order of evaluation of arguments to a function(In this case operator <<) is Unspecified.

My Answer here, explains the problem in detail & should be a good read.

You need to cout them on separate statements.

 cout << "found " << *diiter;
 cout << " at " << distance(di.begin(), diiter)+1;
 cout << " and " << *(++diiter);
 cout << " at " << distance(di.begin(), diiter)+1;
 cout << endl;

This works well & outputs the correct/desired output.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜