旋转矢量时无法确定输出错误的原因

时间:2016-08-18 10:47:36

标签: c++ algorithm

我写了以下代码 -

#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

知道可能出现什么问题吗?

1 个答案:

答案 0 :(得分:2)

对于该输入,程序的输出是正确的。这是你的期望不正确。

要意识到的是标准算法不会取消引用指定的结束迭代器。因此,reverse(v.begin(), v.begin() + 3)会将v的前三个元素(即v[0]v[2])反转,而不是前四个。

因此,第一个reverse()会反转前三个元素,生成订单3 2 1 4 5

为了得到你期望的结果,它将颠倒前四个。