2012-03-07 3 views
2
void insert_string(std::vector<std::string> & strings, const std::string &s) 
{ 

    std::vector<std::string>::iterator it=lower_bound(strings.begin(),strings.end(),s); 
    if(strings.size()>0) std::cout<<*it<<" is found\n"; // **** 
    strings.insert(it,s); 
} 

이 기능을 사용하려고하면 첫 번째 삽입이 정상적으로 진행됩니다. 두 번째 삽입은 "[firststring] is found"를 출력 한 다음 segfault를 출력합니다. if/cout 행을 주석 처리하면 반복적으로 호출 할 수 있으며 segfault가 발생하지 않습니다.C++ : 왜이 ​​벡터 반복자 segfault를 역 참조합니까?

나는 또한 std::string tmp=*it;과 같은 것을 시도해 본 다음 그 줄에서 segfault를합니다. 프린팅이 큰 문제는 아니지만, 내가 정말로하려고하는 것은 lower_bound에 의해 발견 된 위치의 문자열이 삽입하려고하는 문자열과 같은지 확인하는 것입니다 (즉, if(*it==s), 이것은 segfaulting입니다. 두 가지 예).

무엇이 여기에 있습니까?

감사합니다.

+1

확실하게'if (it! = strings.end()) std :: cout << * it << "가 발견되었습니다. \ n";'? – Flexo

+0

죄송합니다. 나는 "found"라는 단어를 사용해서는 안됩니다. 이터레이터가 끝난 값이 무엇인지 인쇄하고 싶습니다. 문자열's'가 실제로이 벡터에서 발견된다는 것을 암시하지 않으려 고합니다. (궁극적으로 내가하고 싶은 것이지만). – Joseph

답변

6

it == strings.end() 인 경우 조건을 확인하십시오. 인쇄하지 않는 경우입니다. 이로 인해 문제가 발생할 수 있습니다. 확인하려고하는 문자열이 문자열의 벡터에 있는지 확 인해 야합니까?

+1

아, 이것이 정확하게 문제입니다. 삽입 할 때 새 문자열이 이미 문자열 벡터에 있는지 여부는 알 수 없습니다. 사실, 그렇다면 추가하고 싶지 않습니다. 이터레이터가 벡터의 끝인지 확인하기 위해 체크를 추가하여 내 문제를 해결했습니다. 감사! – Joseph