STL中unique的用法
和上一篇remove,remove_if相同,unique也是algorithm中的方法,故使用时应包含该头文件。unique方法本意为去重(去除重复元素),但是功能限制为只能对附近相邻的元素进行比较,所以要和sort方法放在一起联合使用,才能实现其效果,否则如下面的代码中无序的排列并不能实现其去重的效果:
1 int main(int argc, char* argv[]) 2 { 3 std::vector<int> vec; 4 vec.push_back(6); 5 vec.push_back(2); 6 vec.push_back(3); 7 vec.push_back(4); 8 vec.push_back(8); 9 vec.push_back(12); 10 vec.push_back(33); 11 vec.push_back(4); 12 vec.push_back(22); 13 14 std::vector<int>::iterator iter; 15 iter = std::unique(vec.begin(),vec.end()); 16 vec.erase(iter, vec.end()); 17 18 for (iter = vec.begin(); iter != vec.end(); iter++) 19 { 20 printf("%d\n",(*iter)); 21 } 22 23 return 0; 24 }
结果为:6 2 3 4 8 12 33 4 22 (9个元素)
如果加上sort排序:
1 int main(int argc, char* argv[]) 2 { 3 std::vector<int> vec; 4 vec.push_back(6); 5 vec.push_back(2); 6 vec.push_back(3); 7 vec.push_back(4); 8 vec.push_back(8); 9 vec.push_back(12); 10 vec.push_back(33); 11 vec.push_back(4); 12 vec.push_back(22); 13 14 std::sort(vec.begin(),vec.end()); 15 16 std::vector<int>::iterator iter; 17 iter = std::unique(vec.begin(),vec.end()); 18 vec.erase(iter, vec.end()); 19 20 for (iter = vec.begin(); iter != vec.end(); iter++) 21 { 22 printf("%d\n",(*iter)); 23 } 24 25 return 0; 26 }
结果为:2 3 4 6 8 12 22 33(8个元素)
和remove类似,unique返回的也是要求去重范围区间中的最后一个元素的位置迭代器,故其后接的vec.erase(iter, vec.end());就是将找出的重复元素位置清空去除。
否则如过没有erase,那么返回的结果将是 2 3 4 6 8 12 22 33 33(9个元素),为什么队列里重复的本来是元素4,结果unique去重以后,反而使元素33重复了呢?
那是因为unique方法中调用的unique_copy方法的返回值是:An output iterator pointing to the end of the copied range.一个指向拷贝区间末端的迭代器指针。
这个拷贝区间就是我们unique方法中指定的传入参数去重区间。所以看到的是末尾的值元素33被拷贝了一次。