打印从adjacent_find返回的两个相邻值

Sta*_*eem 2 c++ stl

我想打印前2个值,其中下一个值是当前值的两倍.

#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;
  }
}
Run Code Online (Sandbox Code Playgroud)

输出是

0 2 4 6 8 10 
found 4 at 3 and 4 at 2
Run Code Online (Sandbox Code Playgroud)

不是我的预期,应该是:

0 2 4 6 8 10 
found 2 at 2 and 4 at 3
Run Code Online (Sandbox Code Playgroud)

我的代码出了什么问题?我不明白当我实际递增第二个位置时,第二个位置是如何从第一个位置递减的.谢谢你的帮助.

Alo*_*ave 5

你的程序给出了奇怪的结果,因为它没有考虑到这个事实,一个函数的参数的评估顺序(在这种情况下是运算符<<)是未指定的.

在这里的答案,详细解释了问题,应该是一个很好的阅读.

你需要cout在不同的陈述上.

 cout << "found " << *diiter;
 cout << " at " << distance(di.begin(), diiter)+1;
 cout << " and " << *(++diiter);
 cout << " at " << distance(di.begin(), diiter)+1;
 cout << endl;
Run Code Online (Sandbox Code Playgroud)

很好用并输出正确/所需的输出.