C++ - std::sort과 std::unique로 std::vector의 중복 요소를 삭제
#include <iostream> // std::cout, std::endl;
#include <algorithm> // std::unique
#include <vector> // std::vector
void printVec(std::vector<int> &vec) {
std::cout << "";
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main() {
std::vector<int> vec = {10,40,40,20,20,30,20,20,40};
std::unique(vec.begin(), vec.end());
printVec(vec); // 10 40 20 30 20 40 ? ? ?
}
std::unique는 인접한 중복 요소를 삭제하지만, vector의 길이 등에는 변경을 가하지 않기 때문에 말미에 쓰레기가 남는다.
그래서 미리 std::sort을 사용하여 vector의 요소를 정렬한 후 std::unique를 적용한다.
#include <iostream> // std::cout, std::endl;
#include <algorithm> // std::sort, std::unique
#include <vector> // std::vector
void printVec(std::vector<int> &vec) {
std::cout << "";
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main() {
std::vector<int> vec = {10,40,40,20,20,30,20,20,40};
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
printVec(vec); // 10 20 30 40
}
std::unique는 쓰레기 앞의 포인터를 돌려주기 때문에 vector::erase에서 뒤의 쓰레기를 삭제한다.
이것으로 중복 요소가 없는 vector를 얻을 수 있다.
이 글은 2020-06-09에 작성되었습니다.