2011-11-13 3 views
2

벡터에서 중복 요소를 지우는 방법을 알고 있습니다.STL 벡터에서 짝수 인덱스의 중복 요소 지우기

data.erase(std::unique(data.begin(), data.end()), data.end()); 

인덱스 0, 2, 4, 6, 8, ...의 중복 요소는 어떻게 지울 수 있습니까?

예 :

더 라이브러리 함수는 이것에 대한 없습니다
 
index : 0 1 2 3 4 5 6 7 8 9 
data : a b a d b f a h b k 
     ^^^^^
     ^^^^
       ^--same-^ 
     ^^ ^
     ^^ ^
     ^-----same--^ 
after erasing 
data : a b d b f h k 

after concatenatiom 
data : a b d b f h 
+0

모든 복제본을 지우시겠습니까? es (당신의 예제가 제안하는 것처럼), 아니면 단지 ** 인접한 ** 것들 (이것은'std :: unique'에서 무엇입니까?)? –

+0

당신의 예제가 잘못되었거나'erase'와'std :: unique'를 사용하는 접근 방식으로는이 문제가 해결되지 않습니다. 이 점을 분명히하십시오. – moooeeeep

+0

BTW, "k"가 귀하의 예에서 최종 결과에없는 이유는 무엇입니까? –

답변

2

. 당신이 원하는 것은 std::unique을 사용하는 것과 비슷하지 않습니다. 인접한 중복 만 제거하기 때문에 귀하의 예에서와 같이 수행하는 것과 비슷합니다. 여기에서 대부분의 작업을 스스로해야합니다.

세트를 만듭니다. 이상한 인덱스를 건너 뛰어 벡터를 반복합니다. 루프 할 때 해당 요소가 세트에 있는지 확인하십시오. 그럴 경우 해당 색인을 제거 대상으로 표시하고, 그렇지 않으면 요소를 세트에 추가하십시오. 벡터에서 표시된 색인을 모두 제거하십시오. 요소 값 (인덱스가 아닌)에서 작동하기 때문에 std::remove 또는 std::remove_if을 사용할 수 없습니다. 평범한 for for 루프를 사용해야합니다.

그러나 특정 값을 불법으로 지정하면 인덱스를 추적하는 대신 요소를 실제로 잘못된 값으로 변경할 수 있습니다. 그렇다면 std::remove을 사용할 수 있습니다.

0

this에 게시 된 제안 (Fred Nurk)을 매우 비슷한 질문으로 받아 들일 수 있습니다. 짝수 (또는 홀수) 색인 요소 만 터치하려면 추가 ++x;이 필요합니다.

예 :

set<string> found; 
for (list<string>::iterator x = the_list.begin(); x != the_list.end();) { 
    if (!found.insert(*x).second) { 
    x = the_list.erase(x); 
    } 
    else { 
    ++x; 
    } 
    ++x; // <-- one increment added to skip the odd-indexed elements 
} 
2

이 특히 우아한 코드가 아닙니다,하지만 기본 해시만큼 작동합니다 비교가 충분하고, 합리적으로 효율적으로해야합니다

template <typename T> 
void RemoveEvenDuplicates(std::vector<T>& v) { 

    std::unordered_set<T> s; 
    std::vector<T>::size_type i = 0; 

    auto last = std::remove_if(
     v.begin(), 
     v.end(), 
     [&s, &i] (const T& element) -> bool { 
      if (i++ % 2 == 0) { 
       auto pair = s.insert(element); 
       return !pair.second; 
      } 
      return false; 
     } 
    ); 

    v.erase(last, v.end()); 

} 

void main() { 

    std::vector<std::string> v; 
    v.push_back("a"); 
    v.push_back("b"); 
    v.push_back("a"); 
    v.push_back("d"); 
    v.push_back("b"); 
    v.push_back("f"); 
    v.push_back("a"); 
    v.push_back("h"); 
    v.push_back("b"); 
    v.push_back("k"); 

    RemoveEvenDuplicates(v); 

} 

애프터 RemoveEvenDuplicates을 호출하면 벡터는 다음과 같이됩니다.

[7]("a","b","d","b","f","h","k") 
관련 문제