C++ std::vector::insert提供意外结果
输入是大小为n的2D矩阵,它包含从1到n的所有值,即从1到n的每个值^2在矩阵中正好出现一次。 我试图使用向量对在向量中的位置n保存输入的索引值(1到n*n)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
#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()
或其他验证,以避免在输入错误时写入超出向量边界的内容。