2012-03-23 2 views
3

내 프로그램에서 벡터 집합을 만들었으며 각 집합을 통과해야합니다. 세트에 특정 요소가있는 경우 벡터에 새 세트를 추가해야합니다. 그러나 이것은 배열의 카운터가 나중에 (루프 내에서) 삽입 한 요소에 도달하자마자 세그먼트 오류를 ​​발생시킵니다. 다음 코드에서 list.push_back (cS)을 켜면 세그먼테이션 오류가 발생합니다.집합의 C++ 벡터가 push_back을 수행 한 후 세그멘테이션 오류를 발생합니다.

int main(void) { 
set<int> cS; 
vector<set<int> > list; 

cS.insert(1); 
list.push_back(cS); 

cS.insert(2); 
list.push_back(cS); 

for (int ctr = 0; ctr < list.size(); ctr++) 
{ 
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++) 
    { 
     if (*itr == 1 || *itr == 2) 
     { 
      cS.clear(); 
      cS.insert(3); 
      //list.push_back(cS); 
     } 
    } 
} 

for (int ctr = 0; ctr < list.size(); ctr++) 
{ 
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++) 
    { 
     cout << *itr << endl; 
    } 
} 

return 0; 
} 

누군가이 오류 (gcc)를 왜 설명 할 수 있다면 감사하게 생각합니다.

내 게시물을 검토해 주셔서 감사합니다.

+0

가 아닌 벡터 : 하나의 해결책은 루프의 후 한 번에 모두 별도의 목록 (벡터)에 세트를 추가 한 다음 추가하는 것입니다 ? –

+0

버릇이 없다고 생각합니다. 내가 아는 한, 벡터의 경우 반복자 또는 인덱스를 사용하는 것은 동일합니다. – Arani

답변

4

벡터에 push_back을 입력하면 벡터가 더 많은 메모리를 할당해야하는 경우에 요소에 대한 모든 참조가 무효화됩니다. 귀하의 경우, 반복자 itrpush_back 이후에 유효하지 않게됩니다.

그냥 당신이 세트에 대한 반복자를 사용 않는 이유 호기심, 중
vector<set<int> > add; 
for (int ctr = 0; ctr < list.size(); ctr++) 
{ 
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++) 
    { 
     if (*itr == 1 || *itr == 2) 
     { 
      cS.clear(); 
      cS.insert(3); 
      add.push_back(cS); 
     } 
    } 
} 
list.insert(list.end(), add.begin(), add.end()); 
+0

그런 경우에는 벡터의 각 요소를 반복 할 수있는 방법이 없지만 특수한 경우에 요소를 삽입하는 방법이 있습니까? – Arani

+0

'push_back'은 반드시 반복자를 무효로하지 않습니다.'push_back '을 호출하면 무효화 될 수 있습니다. – Nawaz

+0

@ user571376 : 인덱스 기반 반복을 사용하십시오. – Nawaz