Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector::insert提供意外结果_C++_Stl - Fatal编程技术网

C++ std::vector::insert提供意外结果

C++ std::vector::insert提供意外结果,c++,stl,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的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
#包括
#包括
使用名称空间std;
int main(){
int n;
cin>>n;
INTA[n][n];
向量v(n*n);
对于(int i=0;ia[i][j];
}
}
对于(int i=0;i,通过写入
向量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);

当参数超出界限时,它抛出一个超出范围的异常。这当然是更安全的解决方案。< /P>这不是C++,这是最有可能的GNU-C++。它具有更好的矩阵表示,它与<代码> STD::向量< /代码>可能是代码> STD::向量< /代码>。如果我理解你正在做什么(我可能不),您不必使用迭代器。只需对i、j和a[i][j进行一些简单的数学运算即可。更好的矩阵表示法是使用Boost的uBLAS库及其矩阵定义。否则,请将数组和向量的维数保持为1,如

加倍my_矩阵[W*H];
建议使用
v.at()
或其他验证,以避免在输入错误时写入超出向量边界的内容。