需要一个带有一对(int,int)的2D向量作为元素。下面的代码给出了SIGSEGV的运行。如何解决?
int main()
{
vector< vector<pair<int, int> > >v;
//vector< vector<pair<int, int> > >v(3), problem is resolved, but how ?
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 3; ++j)
v[i].push_back(make_pair(i, j));
for(int i = 0; i < 3; ++i)
{
cout<<"\n";
for(int j = 0; j < 3; ++j)
cout<<"{"<<v[i][j].first<<", "<<v[i][j].second<<"} ";
}
return 0;
}
答案 0 :(得分:1)
一开始,v
只包含任何内容,因此如果在
v[0].push_back(make_pair(0, 0)); // First loop
如果您使用长度3初始化v
,那么v[0]
是一个有效的语句,不会导致分段错误。
如果您没有使用大小初始化v
,则以下代码应该有效。
for(int i = 0; i < 3; ++i){
vector<pair<int,int> > t;
for(int j = 0; j < 3; ++j)
t.push_back(make_pair(i, j));
v.push_back(std::move(t));
}
感谢 Zereges 进行代码改进
答案 1 :(得分:0)
你插错了。
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 3; ++j)
v[i].push_back(make_pair(i, j));
更改您的插入代码,如下所示:
for(int i = 0; i < 3; ++i)
{
vector<pair<int, int>> vctr;
for(int j = 0; j < 3; ++j)
{
vctr.push_back(make_pair(i, j));
}
v.push_back(vctr);
}
创建一个对的向量,让我们说:(vctr),然后插入对&lt; i,j &gt;在(vctr)。 然后将vctr插入vector(v)。