2013-02-21 6 views
0
  std::vector<struct::event>::iterator it; 
      std::vector<struct::event>::iterator last=myvector.end(); 

      for (it=myvector.begin(); it<=last; it++){ 

      if(mysignal.declination<(*last).declination){ 

       if (mysignal.declination>=(*it).declination && mysignal.declination<(*(it+1)).declination){ 
       myvector.insert(it+1, mysignal); 
       break; 
       } 
      } 
      if (mysignal.declination>=(*last).declination){ 
       myvector.push_back(mysignal); 
       break; 
      } 


      } 

나는 위도가 정렬 된 이벤트가있는 myvector라는 벡터를 가지고 있습니다. 이제이 벡터에 적절한 위치에 mysignal을 추가하고 싶습니다. 하지만 나는 항상 다음과 같은 몇 가지 이벤트가 발생하면 seg 오류가 발생합니다. if (mysignal.declination < (* last) .declination). 나는 무엇이 잘못되었는지를 볼 수 없다.C++ stl 벡터 반복자 삽입 분할 오류

+0

좋아, 사용할 수 없으며 루프 조건이 수정되었습니다. 그러나 벡터가 초과 실행을 방지하려면 어떻게해야합니까? 나는 myvector의 모든 사건보다 더 큰 적위를 가진 사건이있을 때, (it + 1)의 권리가 없을 것입니다. (그리고 이것은 추측 할 것입니다.) 그래서 last>와 같은 것을 사용하지 않으면 푸시 백 라인에 어떻게 접근 할 수 있습니까? – user2097362

답변

0

다른 사람들이 말했듯이 C++ 반복기는 반 개방 간격 ('[begin()...end())')을 정의합니다. 이는 대부분의 다른 경우에도 마찬가지로 이어야합니다. 그리고 그것은 벡터의 반복자에서 작동하지만 일반적으로 반복자는 <= (또는 <)을 지원하지 않습니다. 루프에 대한 표준 관용구는 다음과 같습니다

for (auto current = container.begin(); 
     current != container.end(); 
     ++ current) ... 

(당신이 C++ (11)에 포함되지 수있는 가장 가능성이 경우, 당신은 전체 반복자 타입을 쓰기보다는 auto을 사용해야합니다. auto은 VC++ 11 의 최신 버전이 g ++ 인 C++ 11 에서 작동하는 것으로 보이는 몇 가지 것 중 하나이기 때문에 걱정되는 유일한 대상인 경우 수 있습니다. 항상 최신 버전을 사용하고 있는지 확인하십시오. 사용 가능)

또한 벡터의 마지막 요소 인 에 액세스하려는 경우 myvector.back()은 해당 루프에 대한 참조를 반환합니다. 벡터가 비어 있으면 벡터가 비어있는 경우 myvector.back()은 정의되지 않은 동작이지만 벡터가 비어 있으면 루프를 입력하지 않아도됩니다.

0

end()는 컨테이너의 마지막 요소를 나타내지 않으므로 다음과 같이 조건을 변경해야합니다.

for (it=myvector.begin(); it != last; it++){ 

마지막으로 수정해야하는 다른 역 참조 논리가 있습니다. 귀하의 루프가 잘못

2

the docs 읽기 :

컨테이너의 마지막 요소 다음 요소에 대한 반복자를 돌려줍니다. 이 요소는 자리 표시 자 역할을 수행합니다. 액세스하려고하면 정의되지 않은 동작이 발생합니다.

당신은 end() 역 참조, 그것은 당신의 루프 조건이 it != myvector.end()해야한다 있도록, 컨테이너를 오버런 것을 알 수있는 방법을 제공 할 수 없으며, last도 잘못된 것입니다.

+0

ED, 술어가 일부 주소를 반환합니까? – blackmath

+1

@blackmath : 아니요, "조건"이라고 했어야합니다. 루프 상태는'end()'를 포함하지만'it == end()'이면 루프가 종료되어야합니다. –

+0

나는 이것을 안다. 하지만 무슨 일이 벌어지고 있는지 깊이 생각하고 있었고, 최종 주소는 쓰레기 같은 것이므로 결코 일치하지 않을 것이라고 생각합니다. 내가 추측하는 충돌 없음 – blackmath