2013-01-13 2 views
9

각 루프마다 새로운 C++ 11을 사용하여 목록의 모든 요소를 ​​반복하고 certains 요소를 지우고 싶습니다. 예를 들어각 루프마다 C++ 11에서 std :: list의 요소를 지울 수 있습니까?

std::list<int> myList; 
myList.push_back(1); 
myList.push_back(13); 
myList.push_back(9); 
myList.push_back(4); 

for(int element : myList) { 
    if(element > 5) { 
     //Do something with the element 

     //erase the element 
    }else{ 
     //Do something else with the element 
    } 
} 

는 각 for 루프를 사용하여이 작업을 수행하기 위해 또는 내가 이것을 실현하려 반복자로 돌아 가야 할 수 있습니까?

+3

왜 remove_if/erase를 사용할 수 없습니까? –

+3

또는 단지'list :: remove_if', 반복기 필요 없음. –

+0

@ KarthikT and @BenjaminLindley : 미안하지만, 내 질문에 언급하지 않았다. 나는 조건을 충족시키는 요소들과 모든 다른 요소들과 함께 몇 가지 것들을하고 싶다. 아마 이것을'list :: remove_if'에 의해 사용 된 Predicate 함수에 넣을 수 있습니다 만, 그렇게 좋지는 않습니다. – Haatschii

답변

6

당신은 그냥이

myList.erase(std::remove_if(myList.begin(), myList.end(), 
    [](int& element) 
    { 
     return element > 5; 
    } 
    ),myList.end()); 

하거나 (제공 : 벤자민 린들리를) 할 수 있어야

myList.remove_if(
    [](int& element) 
    { 
     return element > 5; 
    } 
    ); 
+2

요소를 이동하는 것은 꽤 비효율적입니다. –

+0

흠, 멋진 편집 :)하지만 대기 ...'std :: erase'? 이걸 컴파일하려고 했나요? –

+2

@ Cheersandhth.-Alf 나는 실수라고 생각합니다. 제거와 삽입은 O (1) for std :: list입니다. 시프트는 std :: vector와 같은 순차적 컨테이너에서 발생합니다. –

0

아니, 난 그렇게 생각하지 않습니다. this SO answer:

아니요, 할 수 없습니다. Range-based for는 컨테이너의 각 요소에 한 번만 액세스해야하는 경우입니다. 당신은 당신이 함께 가서 이상 번 요소에 액세스하거나 그렇지 않으면 컨테이너를 통해 비선형 방식으로 반복 컨테이너를 수정 필요한 경우

당신은 루프의 정상을 사용해야하거나 하나는 사촌이다 .

5

표준 컨테이너의 요소를 해당 컨테이너의 루프를 기반으로 범위에서 삭제할 수 없습니다. 루프 자체에는 현재 방문중인 요소에 대한 반복기가 있으며 삭제하면 해당 반복기가 무효화됩니다 루프가 그것을 증가시키기 전에.

범위 기반 표준의 6.5.4에 정의를 위해이 동등 (약간 단순화) 될 :

for (auto __begin=begin-expr, __end=end-expr; __begin != __end; ++__begin) { 
    for-range-declaration = *__begin; 
    statement 
} 

begin-exprend-expr 자신의 긴 정의를 가지고 있지만, 귀하의 예제에서 그들은 myList.begin()을하고 myList.end()입니다.

관련 문제