2014-02-24 4 views
3

그러므로 내가 가지고있다 std::vector<type>.벡터에서 중복 된 요소를 제거하는 방법은 무엇입니까?

operator<을 가지지 만, operator==을 가지고있다. 따라서 std::unique을 사용하여 벡터를 정렬 할 수 없습니다.

중복 된 요소를 벡터에서 어떻게 제거 할 수 있습니까?

+1

효율적으로이 작업을 수행하는 작은 기회를했습니다가. 분류되지 않은 주문 (주문 기능이 없어야 함)은 O (N^2) - 토지로 곧장 가게합니다. – WhozCraig

+1

@WhozCraig : 꼭 그렇지는 않습니다. 완벽한 해시를 올리면 O (N)에서 할 수 있습니다. –

+0

@MatthieuM. 완벽한 해시를 제공 할 수 있다면 처음에는'std :: unordered_set'보다는 정렬되지 않은 벡터에서 무엇을하고 있습니까? 나는 우리가 함께해야만했던 * OP *가 * 제공 한 정보가 OP의 제공 한 정보를 제공했다는 이유로 내 주장을 근거로 삼았다. 그들은 합리적인 해시 (완벽한 또는하지 않은 경우), 다음이 문제의 X "왜 내가 틀린 컨테이너를 사용하고 있습니까?" 그리고 명백하게 나는 그것이 작동하지 않을 그런 해시를 주어서 말할 수 없다; 분명히 그럴 것이다. – WhozCraig

답변

1

나는 최상의 옵션은 벡터의 정렬에 사용하기 위해 이진 술어를 작성하고 나중에 std::unique을 사용하는 것이라고 생각한다. 술어는 전 이적이어야합니다!

이 당신이 quardatic 알고리즘을 다른 작업을 수행하지만, 사용할 수있는 옵션이 아닌 경우 : 당신을 주문하지 않고

std::vector<type> a 
std::vector<type> result; 
for (unsigned i = 0; i < a.size(); ++i) { 
    bool repeated = false; 
    for (int j = 0; j < i; ++j) { 
    if (a[j] == a[i]) { 
     repeated = true; 
     break; 
    } 
    } 
    if (!repeated) { 
    result.push_back(a[i]); 
    } 
} 

// result stores the unique elements. 
관련 문제