我写了以下代码 -
#include <cassert>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
vector<int> v;
int main()
{
int n, d, i = 0;
cin >> n >> d;
assert(n >= 1 && n <= 100000 && d >= 1 && d <= n);
int temp = 0;
for (int i = 0; i < n; i++)
{
cin >> temp;
v.push_back(temp);
}
reverse(v.begin(), v.begin() + d - 1);
reverse(v.begin() + d, v.end());
reverse(v.begin(), v.end());
for (i = 0; i < n; i++)
cout << v[i] << " ";
return 0;
}
现在,问题是当我输入以下输入时 -
5 4
1 2 3 4 5
它没有给我正确的输出5 1 2 3 4
,而是给了我5 4 1 2 3
知道可能出现什么问题吗?
答案 0 :(得分:2)
对于该输入,程序的输出是正确的。这是你的期望不正确。
要意识到的是标准算法不会取消引用指定的结束迭代器。因此,reverse(v.begin(), v.begin() + 3)
会将v
的前三个元素(即v[0]
到v[2]
)反转,而不是前四个。
因此,第一个reverse()
会反转前三个元素,生成订单3 2 1 4 5
。
为了得到你期望的结果,它将颠倒前四个。