2015-09-06 91 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()'或其他验证来避免在输入错误的情况下写入向量的边界。 –

相关问题