2017-02-27 16 views
-1

편집을 삭제 :이 질문은 수 std :: 목록 특별히 의미 - 스택 오버플로 다른 유사한 질문 : 나는 C++을 사용하고 데 문제가 표준에서 요소를 삭제하는 데 문제가C++ 목록 반복하고

을 벡터 수 std 참조 :: iterating 동안 목록. 나는 사용자 정의 클래스 (이 질문을 위해 '개체')의 목록을 가지고 내 코드는 다음과 같습니다 : '전화가 성병에 대한 일치 기능 : I 오류를 받고 있어요

for(auto i : Objects) 
    if(i.EraseFlag == true) 
     { 
      i = Objects.erase(i); 
     } 

: : list :: erase (&) '

나는이 방법이리스트를 반복하고, 요소를 지우고 지우개를 고려하지만 반복자를 반환하는 올바른 방법이라고 생각한다. 나는 뭔가 잘못하고있다. 이전에는 벡터를 사용할 때 for 루프에서 정수가되는 'Objects.erase (Objects.begin() + i)'를 사용했지만 목록의 액세스 요구 사항이 주어지면 작동하지 않습니다.

감사합니다.

감사

+0

소거()에 대한 상기 범위를 기반으로 'for' 루프 중 서열을 변경해서는 안 –

+1

그 파라미터 반복자 걸린다. – PaulMcKenzie

+1

*이 방법은 목록을 반복하고, 요소를 지우고 지우는 것을 고려한 반복자를 반환하는 올바른 방법이라고 생각합니다 (C++ 11 이상) - 지우는 것을 고려하여 반복자를 반환하는 이유는 무엇입니까? '지우기/제거 '관용구, 루프가 필요없는 곳? – PaulMcKenzie

답변

1

회원 기능 반복자와 erase 다룬다.

이러한 작업을 수행하려면 일반 for 루프를 올바르게 사용해야합니다. 예를 들어

for (auto it = Objects.begin(); it != Objects.end();) 
{ 
    if (it->EraseFlag) it = Objects.erase(it); 
    else ++it; 
} 

다른 접근법 remove_if 멤버 함수를 사용하는 것이다. 예

Objects.remove_if([](const auto &value) { return value.EraseFlag; }); 
+0

을 사용해 봐야한다고 생각합니다. Vlad 님, 초기 루프가 작동하는 것 같습니다. 그것은 remove_if를 사용하여 보이는 것이 이것을 수행하는 가장 좋은 방법 일 것입니다. 여러분도 포함 시켰기 때문에 이것을 대답으로 표시 할 것입니다. – nathanburns

+0

@nathanburns 전혀 없습니다. 천만에요. –