std :: vector :: insert给出了意想不到的结果

时间:2015-09-06 21:39:42

标签: c++ stl

输入是大小为n的2D矩阵,它包含从1到N的所有值,即从1到N ^ 2的每个值在矩阵中恰好出现一次。 我正在尝试使用向量中位置n处的向量对来保存输入的索引值(1到n * n)。

#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循环的第一次迭代之后获得意外的输出。

1 个答案:

答案 0 :(得分: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异常。这当然是更安全的解决方案。