2016-08-18 53 views
-3

我寫了下面的代碼輸出是錯誤的 -不能確定爲什麼而旋轉矢量

#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

您是否嘗試過使用調試器? –

+0

@AlgirdasPreidžius - 不幸的是,這是一個新的系統,我沒有調試工具的設置。再加上它是Linux :( –

+1

那麼?[Linux有很多調試器。](http://www.drdobbs.com/testing/13-linux-debuggers-for-c-reviewed/240156817) Linux發行版的軟件包管理器應該少於5分鐘(甚至可能已經安裝了[GDB](https://en.wikipedia.org/wiki/GNU_Debugger)的基本命令行版本,即使) –

回答

2

對於該輸入,程序的輸出是正確的。這是你的期望是不正確的。

要實現的事情是標準算法不解引用指定的結束迭代器。因此,reverse(v.begin(), v.begin() + 3)將使v(即v[0]v[2])的前三個元素不是前四個。

因此,第一個reverse()顛倒了前三個元素,生成訂單3 2 1 4 5

爲了得到您期望的結果,它將扭轉前四個。

+0

非常感謝Peter,請你解釋一下這一行 - 「要實現的事情是標準算法不能解引用指定的結束迭代器。」 –

+1

這意味着對應於結束迭代器的值永遠不會被訪問。 – Peter