문제

정확히 "Assert", 또는 더 구체적으로는 오류를 제거하는 방법. 데이터 멤버 in x와 함께 클래스에 포인터의 벡터를 만들 때 다음을 수행 할 때 다음을 수행합니다.

for(I=antiviral_data.begin();I<antiviral_data.end();I++)
{
    if((*I)->x>maxx)
    {
        antiviral_data.erase(I);
    }
}

프로그램을 실행하면 X가 Maxx보다 클 때까지 오류가 발생하지 않고 .erase ()를 사용합니다.이 시점 에서이 오류가 발생합니다.

디버그 어설 션이 실패했습니다!

프로그램 : ... 내 문서 O.exe 파일 : ... 포함 vector line : 116

표현 : ( "this-> _ has_container ()", 0)

프로그램이 어설 션 실패를 일으키는 방법에 대한 자세한 내용은 Asserts의 Visual C ++ 문서를 참조하십시오.

(Retry를 눌러 응용 프로그램을 디버깅)

abort] [Rech] [무시

또한 Cout을 사용하려고한다면 :

cout<<(*antiviral_data.begin())->x<<endl;

이 오류가 발생합니다.

디버그 어설 션이 실패했습니다!

프로그램 : ... 내 문서 O.exe 파일 : ... 포함 vector line : 98

표현식 : 벡터 반복자는 연기가 불가능합니다

프로그램이 어설 션 실패를 일으키는 방법에 대한 자세한 내용은 Asserts의 Visual C ++ 문서를 참조하십시오.

(Retry를 눌러 응용 프로그램을 디버깅)

abort] [Rech] [무시

누군가 벡터의 데이터를 사용할 수없는 이유와이를 해결하는 방법을 알려 주시겠습니까?

또한 : antiviral_data는 단일 요소를 가진 포인터의 벡터입니다.

antiviral_data.push_back(new aX1(player.x,player.y,'>'));

그것이 도움이된다면.

도움이 되었습니까?

해결책

당신이 주장을받는 가장 가능한 이유는 지우기 후에 i를 증가시키기 때문입니다. 대신 시도해보십시오.

for(I=antiviral_data.begin();I!=antiviral_data.end();)
{
    if((*I)->x>maxx) I=antiviral_data.erase(I); else ++I;
}

또한보십시오 http://www.cppreference.com/wiki/stl/vector/erase , 검색 잘못된 반복자 그 페이지에서.

다른 팁

ASSERT는 일반적으로 디버그 및 오류 제어 목적으로 개발자가 입력 한 표현식입니다. 코드에 다른 "사전 확인"을 넣고 수표에 도달하지 않으면 프로그램에 충돌하도록합니다.

예를 들어, 길 어딘가에 두 개의 숫자를 나눌 코드가 있다고 상상해보십시오. 비록 당신은 항상 0이 아닌 분열을 기대하지만, 논쟁이 잘못 계산 될 경우를 대비하여 부서 앞에있는 주장을 제시합니다. 어설 션이 실패하면 도로 어딘가에 실패가 있음을 의미합니다.

어설 션은 일반적으로 코드의 디버그 버전에만 나타납니다 (Visual C ++를 사용하는 경우 디버그 및 릴리스를 위해 컴파일 할 수 있음). 릴리스 모드에서 컴파일하면 결과가 제거되지만 여전히 오류가 있고 결과가 나쁘기 때문에 매우 나쁜 생각입니다.

벡터 (표준)의 구현 어딘가에, 98 행에 구체적으로 설명되어 있습니다. 벡터 코드에 액세스 할 수있는 경우 어설 션이 무엇인지 확인하거나 해당 시점까지 디버그하십시오. 벡터 구현 또는 벡터를 호출하는 코드에 오류가 표시 될 수 있습니다.

게시 한 내용은 우리에게 무슨 일이 일어나고 있는지에 대한 힌트를 제공하지만 벡터가 정의되는 위치를 포함하여 더 많은 프로그램을 붙여 넣을 수있는 경우 유용 할 것입니다.

문제는 Erase Call에 관한 것입니다. 당신은 컨테이너를 통해 반복하고 동시에 요소를 지우고 있습니다. 지우기 후에 반복자가 유효하지 않습니다. 벡터 사용에서 특정 값의 요소를 제거하려면 remove_if 알고리즘으로 지우기를 원합니다. 이것은 지우기 정리 관용으로 알려져 있으며 Scott Meyer의 효과적인 STL 책에서 매우 잘 설명되었습니다. 이 질문을 참조 할 수도 있습니다 벡터에서 요소를 지우는 것 자세한 내용은.

당신은 이미 주장이 무엇인지, 왜 코드에서 트리거되는지에 대한 몇 가지 좋은 답변을 가지고 있습니다. 이제 2 개의 패스 삭제에 STL 알고리즘을 사용하는 것을 고려할 수 있습니다.

namespace {
   struct exceeds : public std::unary_function< TheUnknownType*, bool >
   {
      exceeds_max( int max ) : maxx( max ) {}
      bool operator()( TheUnknownType* data ) {
         return data->x < max;
      } 
   private:
      int maxx;
   };
}
void your_function()
{
   std::vector< TheUnknownType* >::iterator new_end;
   new_end = std::remove_if( antiviral_data.begin(), antiviral_data.end(), exceeds(maxx) );
   antiviral_data.remove( new_end, antiviral_data.end() );
}

주요 장점은 벡터에서 요소를 지우는 것이 비싼 작업이라는 것입니다. 각 요소가 지워지면 해당 위치에서 벡터의 끝까지 모든 요소는 시작을 향해 한 위치를 이동해야합니다. 당신이 지우는 두 번째 요소는 거기에서 모든 요소의 두 번째 움직임을 강요 할 것입니다 ... STL remove_if 알고리즘은 반복기를 반환하는 최종 위치로 한 번만 이동을 수행합니다. 과거 마지막 요소가 제거되지 않았습니다. 그런 다음 하나의 std :: vector <> :: 제거를 수행 할 수있는 하나의 STD :: Vector <>를 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top