2014-11-09 3 views
-1

제 생성자의 경우 정수 벡터를 입력하고 생성자 내에서 theSet이라는 bool 유형의 다른 벡터를 설정합니다. 입력 벡터에서 모든 요소를 ​​검사하여 0에서 20 사이인지 확인합니다. true이면 theSet의 요소가 true입니다.벡터 오류를 통한 참조 해제

그러나 set 벡터를 역 참조하는 구현에 문제가 있습니다.

class Set 
{ 
public: 
    Set(vector<int> &); 
    bool IsMember(int); 

private: 
    vector<bool> theSet; 

} 

bool Set::IsMember(int x) 
{ 
    if ((x >= 0) && (x <= 20)) 
     return true; 
    else 
     return false; 
} 


Set::Set(vector<int> &v) 
{ 
    int length = v.size(); 
    theSet.reserve(length); 

    bool check; 

    int p = 0; 
    for (int i = 0; i < length; i++) 
    { 
     theSet[i] = IsMember(v[i]); 
    } 
} 
+0

그리고 어떤 문제가 있습니까? – Radiodef

+1

@Radiodef 방금 코드를 복사/붙여 넣었고 msvcr은 theSet [i] = IsMember (v [i])를 수행 할 때'벡터 반복자가 참조 할 수 없다 '고 주장하는 디버그 어설 션 오류가 발생합니다. – PuerNoctis

+0

@PuerNoctis OP가 문제를 * 알려 주어야합니다. 왜냐하면 나는 이미 그것들을 컴파일하려 했었다고 가정하기 때문이다. – Radiodef

답변

1

theSet.reserve() 대신 theSet.resize()을 사용하면 효과가있을 것입니다. 시도해보십시오. reserve()을 사용하면 삽입을 위해 메모리를 미리 할당하고 있지만 메모리 자체는 단위 화되어 있습니다. 진짜 요소는 아직 없습니다. 루프 내에서 값을 수정하려고하면 위치 i에있는 값에 대한 참조를 요청하지만 수정 될 수있는 요소가 없으므로 오류가 발생합니다.

+0

벡터 첨자가 범위를 벗어났습니다. –

+0

@monkeydoodle'resize()'가 있다고해도? 이상한 ... – PuerNoctis

+0

사과, 그건 작동합니다. 감사! –