1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /* 제너릭 unique 알고리즘은 입력 시퀀스에서 모든 연속 중복 원소들을 모두 제거한다. 시퀀스 상에서 자신의 왼쪽에 위치한 원소와 값이 동일하면, 그 원소는 중복 원소에 해당한다. 따라서, 원소들로 구성된 그룹이 있다면 그 그룹의 맨 앞의 원소를 제외한 나머지 원소는 unique 알고리즘을 통해 제거된다. remove 알고리즘과 마찬가지로, unique 는 컨테이너의 사이즈를 변경하지 않는다. 대신, 연속 중복 원소가 아닌 것들 을 구간의 왼편에 몰아 넣고, "unique"한 원소들이 끝나는 위치를 가리키는 반복자를 리턴한다. 단, 중복되어 있다고 해서 무조건 제거되는 것이 아니라 반드시 연속적으로 중복되어 있는 경우에만 삭제된다. 시간 복잡도는 선형적이다. */ #include <iostream> #include <cassert> #include <algorithm> #include <vector> using namespace std; int main() { cout<< "Illustrating the generic unique algorithm." << endl; const int N = 11; int array1[N] = {1, 2, 0, 3, 3, 0, 7, 7, 7, 0, 8}; vector< int > vector1; for ( int i=0; i< N; ++i) vector1.push_back(array1[i]); // vector1에서 연속 중복 원소를 제거한다. vector< int >::iterator new_end; new_end = unique(vector1.begin(), vector1.end()); // vector1의 사이즈는 변하지 않는다. assert (vector1.size() == N); // 연이어 붙어 있지 않은 중복 원소들은 [vector1.begin(), new_end)에 // 그대로 남아 있다. new_end 뒷부분의 원소들은 삭제한다. vector1.erase(new_end, vector1.end()); // vector1에 담긴 원소들의 표준 출력 스트림으로 출력 copy(vector1.begin(), vector1.end(), ostream_iterator< int >(cout, " " )); cout<< endl; return 0; } |
'STL > 변경 가능 시퀀스 알고리즘' 카테고리의 다른 글
[STL] swap_ranges (0) | 2010.05.17 |
---|---|
[STL] transform (0) | 2010.05.17 |
[STL] search (0) | 2010.05.17 |
[STL] rotate (0) | 2010.05.17 |
[STL] reverse (0) | 2010.05.17 |