2015-09-06 85 views
-1

輸入是一個大小爲n的二維矩陣,它包含從1到N的所有值,即從1到N^2中的每個值只在矩陣中出現一次。 我試圖保存輸入的索引值(1到n * n)使用向量中位置n的向量對。std :: vector :: insert給出了意想不到的結果

#include <iostream> 
#include<vector> 
using namespace std; 

int main() { 
    int n; 
    cin>>n; 
    int a[n][n]; 
    vector<pair<int,int> > v(n*n); 
    for(int i=0;i<n;i++){ 
     for(int j=0;j<n;j++){ 
      cin>>a[i][j]; 
     } 
    } 
    for(int i=0;i<n;i++){ 
     for(int j=0;j<n;j++){ 
      v.insert(v.begin()+a[i][j]-1, make_pair(i+1,j+1)); 
     } 
    } 
    for(int i=0;i<n*n;i++) 
     cout<<v[i].first<<" "<<v[i].second<<endl; 

    return 0; 
} 

input: 3 
     1 7 9 
     2 4 8 
     3 6 5 
output:1 1 
     2 1 
     3 1 
     0 0 
     3 3 
     2 2 
     3 2 
     0 0 
     0 0 
expected output:1 1 
       2 1 
       3 1 
       2 2 
       3 3 
       3 2 
       1 2 
       2 3 
       1 3 

在for循環的第一次迭代之後獲取意外輸出。

+0

這不是C++,這很可能是gnu-C++和[VLA擴展](http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html)。 – nwp

+0

更好的矩陣表示與'std :: vector'可能是'std :: vector >'。 –

+0

如果我明白你在做什麼(我可能不會),你不應該使用迭代器。只需要對i,j和a [i] [j]做一些簡單的數學運算。 – Aderis

回答

1

通過編寫vector<pair<int,int> > v(n*n);你的載體已經有n * n條目。當您撥打v.insert時,您會在指定位置添加另一個,並將所有其他向量元素向右移。現在,您的矢量具有2 * n * n個條目(您可以嘗試全部打印它們 - 或僅打印其size())。

你應該改變這一行成

v[a[i][j]-1] = make_pair(i+1,j+1); 

或者,如M.M建議,您可以使用

v.at(a[i][j]-1) = make_pair(i+1,j+1); 

當參數超出範圍會拋出一個out_of_range異常。這當然是更安全的解決方案。

+1

建議使用'v.at()'或其他驗證來避免在輸入錯誤的情況下寫入向量的邊界。 –

相關問題