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被拷贝了一次。

posted @ 2012-09-24 11:07  Junki  阅读(1003)  评论(0编辑  收藏  举报