2012-05-02 2 views
-1

그래서 이상한 상황, 구조체 목록을 만들고 다음 목록 구성원 중 하나를 새 값으로 업데이트하고 목록으로 다시 이동하려고합니다.int를 증가시킬 때 벡터 첨자가 범위를 벗어 났습니까?

필자는 iterator에서 struct의 값을 복사 할 수있는 것처럼 보이지만 int의 ++를 사용하여 구조체 멤버의 값을 업데이트하려고하면 모든 것을 벡터 클래스에서 예외가 발생합니다.

여기에서 무슨 일이 일어나는지에 대한 설명이 도움이 될 것입니다.

struct Blob 
{ 
    int x; 
    int y; 
}; 

list<Blob> blob; 
// Add a Blob to blob using .push_back(); here 
for(list<Blob>::iterator iterator=blob.begin(); iterator!=blob.end(); ++iterator) 
{ 
    Blob temp; 
    temp.x = ((Blob)*iterator).x; 
    temp.y = ((Blob)*iterator).y; 
    if (temp.x < 10 - 1) 
     temp.x++; /* Exception: vector: line 932 - "Vector subscript out of range" */ 
    ((Rain)*iterator) = temp; 
} 
+6

을 자신 만의 것이고 이것에 관한 어떤 벡터도 포함되어 있지 않습니다. – PlasmaHH

+2

'((Rain) * iterator) = temp;라고하는 행은 무엇입니까? '비 '란 무엇이며 왜 캐스팅하고 있습니까? – interjay

+3

왜'temp.x = iterator-> x'라고하지 않으시겠습니까? (캐스팅은 필요하지 않지만 문제는 아닙니다.) – Benj

답변

0

개체의 기존 값을 업데이트하려면 참조를 가져옵니다.

#include<list> 
#include<iostream> 
using namespace std; 
struct Test 
{ 
    int x; 
    int y; 
}; 

int main() 
{ 
    list<Test> lTest; 
    int i = 0; 
    for(i=0;i<5;i++) 
    { 
     Test t1; 
     t1.x = i; 
     t1.y = i*i; 
     lTest.push_back(t1); 
    } 

    list<Test>::iterator lIter = lTest.begin(); 
    for(;lIter != lTest.end();++lIter) 
    { 
     Test &t1 = *lIter; 
     cout<<"1 Val is:"<<t1.x<<"|"<<t1.y<<endl; 
     t1.x += 2; 
     t1.y += 2; 
     cout<<"2 Val is:"<<t1.x<<"|"<<t1.y<<endl; 
    } 

    lIter = lTest.begin(); 
    for(;lIter != lTest.end();++lIter) 
    { 
     Test t1 = *lIter; 
     cout<<"3 Val is:"<<t1.x<<"|"<<t1.y<<endl; 
    } 

    return 0; 
} 
+3

참조하기가 왜 어렵습니까? 'lter-> x + = 2'의 문제점은 무엇입니까? – Benj

+0

그건 좋은 생각이야 ..... iter로 일하는 것이 훨씬 낫다. – Raghuram

0

루프를 작성하는 경우 다른 방법이있을 수 있습니다. 당신은 사용할 수 있습니다 std::for_each :

#include <list> 
#include <algorithm> 

struct Blob 
{ 
    int x; 
    int y; 
}; 

void incrementXIfLessThanNine(Blob& blob) 
{ 
    if(blob.x < 9) 
    { 
     blob.x++; 
    } 
} 

int main() 
{ 
    std::list<Blob> blobs; 
    std::for_each(blob.begin(), blob.end(), incrementXIfLessThanNine); 
    return 0; 
} 

당신이 C++ (11) 사용하는 경우 : 컴파일과 같은 동작이 유효 코드 조각보다 훨씬 더 유용 할 것입니다 전시 완전한 테스트 케이스를 표시

#include <list> 

struct Blob 
{ 
    int x; 
    int y; 
}; 

int main() 
{ 
    std::list<Blob> blobs; 
    for(Blob& blob: blobs) 
    { 
     if(blob.x < 9) 
     { 
      blob.x++; 
     } 
    } 
    return 0; 
} 
관련 문제