2017-07-30 212 views
-1

要求带有一对(int,int)的二维向量作为元素。下面的代码给出了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

“2D矢量”只是矢量。弄清楚如何使用矢量,然后你就知道如何使用“2D矢量”。或“3D”。或者更多。 – juanchopanza

+2

看看v(3)的实际含义。 –

回答

1

在开始的时候,v仅含有什么都没有,所以如果SIGSEGV在

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代码改进

+0

'v.push_back(std :: move(t))' – Zereges

+0

@Zereges好吧,复制不会太冗余,只有3 * 3 = 9的大小。 – iBug

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),然后插入(vctr)中的一对< i,j>。 ,然后将vctr插入向量(v)。