和上一篇remove,remove_if相同,unique也是algorithm中的方法,故使用时应包含该头文件。unique方法本意为去重(去除重复元素),但是功能限制为只能对附近相邻的元素进行比较,所以要和sort方法放在一起联合使用,才能实现其效果,否则如下面的代码中无序的排列并不能实现其去重的效果:
1 int main(int argc, char* argv[]) 2 { 3 std::vector 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 ::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 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 ::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被拷贝了一次。