unique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的。在移除重复元素后,它会返回一个正向迭代器作为新序列的结束迭代器。可以提供一个函数对象作为可选的第三个参数,这个参数会定义一个用来代替 == 比较元素的方法。例如:

std::vector words {"one", "two", "two", "three", "two", "two", "two"};

auto end_iter = std::unique(std::begin(words), std::end(words));

std::copy(std::begin(words), end_iter, std::ostream_iterator{std::cout, " "});

std::cout << std::endl;

这样会通过覆盖来消除 words 中的连续元素。输出为:

one two three two

当然,没有元素会从输入序列中移除;算法并没有方法去移除元素,因为它并不知道它们的具体上下文。整个序列仍然存在。但是,无法保证新末尾之后的元素的状态;如果在上面的代码中用 std::end(words) 代替 end_iter 来输出结果,得到的输出如下:

one two three two two two

相同个数的元素仍然存在,但新的结束迭代器指向的元素为空字符串;最后两个元素还和之前一样。在你的系统上,可能会有不同的结果。因为这个,在执行 unique() 后,最好按如下方式截断序列:

auto end_iter = std::unique(std::begin(words), std::end(words));

words.erase(end_iter, std::end(words));

std::copy (std::begin (words) , std::end (words) , std::ostream iterator {std::cout, " "});

std::cout << std::endl;

容器的成员函数 erase() 会移除新的结束迭代器之后的所有元素,因此 end(words) 会返回 end_iter。

当然,可以将 unique() 运用到字符串中的字符上:

string text {"There's no air in spaaaaaace!"};

text.erase(std::unique(std::begin(text), std::end(text),[](char ch1, char ch2) { return ch1 = ' '&& ch1 = ch2; }), std::end(text));

std::cout << text << std::endl; // Outputs: There's no air in spaaaaaace!

这里使用 unique() 会移除字符串 text 中的连续重复的空格。这段代码会用 unique() 返回的迭代器作为 text 成员函数 erase() 的第一个参数,而且它会指向被移除的第一个字符。erase() 的第二个参数是 text 的结束迭代器,因此在没有重复元素的新字符串之后的所有字符都会被移除。

c语言 unique函数,C++ unique(STL unique)算法详解相关推荐

  1. C语言 定义函数妇女 判定整数n,【详解】C语言:编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。...

    #include void itob(int n,char s[], int b) { int i=1; for(;i<=32;i++)    //共循环了32次,保证得到32位的二进制数 { ...

  2. C++ mismatch(STL mismatch)算法详解

    可以用和比较字符串类似的方式来比较序列.如果两个序列的长度相同,并且对应元素都相等,equal() 算法会返回 true.有 4 个版本的 equal() 算法,其中两个用 == 运算符来比较元素,另 ...

  3. 随机迷宫 c语言思路,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  4. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  5. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  6. time库是python中处理时间的标准库_python语言time库和datetime库基本使用详解

    今天是边复习边创作博客的第三天,我今年大二,我们专业开的有这门课程,因为喜欢所以更加认真学习,本以为没人看呢,看了后台浏览量让我更加认真创作,这篇博客花了2个半小时的时间,结合自己所学,所思,所想写作 ...

  7. C语言实现扫雷完整算法详解~(附完整代码~)

    扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...

  8. C语言0长度数组(可变数组/柔性数组)详解

    CSDN GitHub C语言0长度数组(可变数组/柔性数组)详解 AderXCoding/language/c/zero_length_array 本作品采用知识共享署名-非商业性使用-相同方式共享 ...

  9. java调用javascript函数_[Java教程]JavaScript函数的4种调用方法详解

    [Java教程]JavaScript函数的4种调用方法详解 0 2016-08-09 00:00:12 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C# ...

  10. Python函数(函数定义、函数调用)用法详解

    函数 函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码. 函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接 ...

最新文章

  1. git提交过滤target文件 idea_找不到或无法加载主类(IDEA中启动spring boot项目)
  2. 学习_你必须知道的.net2_第四章_一切从IL开始
  3. 第四周作业wcPro
  4. 一个致命的 Redis 命令,导致公司损失 400 万
  5. mysql+tushare搭建本地数据库
  6. ReactiveCocoa核心元素与信号流
  7. Web开发——HTML基础(HTML表单/下拉列表/多行输入)
  8. TensorFlow构建模型(图片数据加载)六
  9. 【冈萨雷斯的数字图像处理1~6章复习考试知识整理】
  10. 牛客网刷题java之(斐波那契数列)一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
  11. 简单分析多个京东快递物流中含有多次派送的单号
  12. c# sqlite 批量修改
  13. 新一轮勒索病毒变种全球肆虐 中国已遭攻击
  14. uniapp基础介绍
  15. 数据结构与算法学习(第一天)
  16. vue动态加载SVG文件并修改节点数据
  17. 深度解密:软银孙正义如何成为美国硅谷最有权势之人
  18. php语音信息,PHP代码示例_PHP语音验证接口 | 微米-中国领先的短信彩信接口平台服务商...
  19. 哪些网站帮你打开了新世界的大门
  20. Python小记 正则

热门文章

  1. Python-Flask开发微电影网站(一)
  2. 近视200度能学计算机吗,近视200度能不能恢复 近视200度该怎么办
  3. apt-get -yqq install 与apt-get install的区别
  4. 【中科院】分子生物学-朱玉贤第四版-笔记-第11-12讲 基因功能研究技术
  5. Android系统安全机制
  6. 拓展编辑器(八)_重写菜单
  7. CSDN日报190219——表面上又佛又丧,背地里天天向上,算是看透你们了
  8. 裁切平面(clipping plane)
  9. 转载一篇知乎上的文章
  10. 【毕设项目问题】IDEA打开springboot项目,启动项上有红色叉叉