C++ includes(STL includes)算法详解

includes() 算法可以比较两个元素的集合,如果第一个集合中的全部元素都来自第二个集合,它会返回 true。如果第二个集合是空的集合,它也返回 true。下面是一些示例:
std::set<string> words1 { "one", "two", "three", "four", " five", "six"};
std::set<string> words2 {"four", "two", " seven"}; std::multiset<string> words3;
std::cout << std::boolalpha>> std::includes(std::begin(words1), std::end(words1), std::begin(words2), std::end(words2))>> std::endl; //Output: false
std::cout << std::boolalpha>> std::includes(std::begin(words1), std::end(words1), std::begin(words2), std::begin(words2))>> std::endl; //Output: true
std::set_union(std::begin(words1), std::end(words1), std::begin(words2), std::end(words2),std::inserter(words3, std::begin(words3)));
std::cout << std::boolalpha>> std::includes(std::begin(words3), std::end(words3), std::begin(words2), std::end(words2))>> std::endl; //Output: true
这里有两个 string 元素的 set 容器,words1 和 words2,它们都是用初始化列表初始化的。第一条输出语句显示 false,因为 word1 不包含 word2 中的 string("seven") 元素。第二条输出语句显示 true,因为第二个操作数指定的集合是空的,也就是说它的开始迭代器和结束迭代器相同。

set_union() 函数会通过 inserter_iterator 将 words1 和 words2 中的并集复制 word3 中。结果 word3 会包含 words2 中的全部元素,因而第三条输出语句会显示 true。

当容器是 multiset 时,会很容易对它们并集运算后的结果感到困惑。尽管 words3 是一个允许包含重复元素的 multiset,但 words1 和 words2 共有的元素并没有重复出现在 words3 中。下面的语句会输出 words3 中的元素:
std::copy(std::begin(words3), std::end(words3),std::ostream_iterator<string> {std::cout," "});
输出结果如下:

five four one seven seven six three two

这是因为并集运算只包含每个重复元素的一个副本。当然,如果 words1 和 words2 是包含重复单词的 multiset 容器,那么结果可能会包含一些重复元素:
std::multiset<string> words1 {"one", "two", "nine", "nine", "one", "three", "four", "five", "six"};
std::multiset<string> words2 {"four", "two", "seven", "seven", "nine", "nine"};
std::multiset<string> words3;
"one" 是 words1 中的重复元素,"seven" 是 words2 中的重复元素。"nine" 在这两个容器中都是重复的。现在可以指向相同的 set_union():
std::set_union(std::begin(words1), std::end(wordsl),std::begin(words2), std::end(words2), std::inserter(words3, std::begin(words3)));
输出的 words3 的内容如下:

five four nine nine one one seven seven six three two

并集结果中会有一个或多个重复元素,对于在两个集合中都单独出现的元素,并集运算中不会有重复的元素。当然,如果元素在两个集合中都重复,那么它们在结果中也是重复的。

推荐文章
C语言百钱买百鸡(百钱百鸡,百鸡问题)

中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何? 实现过程: (1)使用for语句对3种鸡的数

MySQL HAVING:过滤分组

在MySQL中,可以使用HAVING 关键字对分组后的数据进行过滤。 使用HAVING关键字的语法格式如下: HAVING HAVING关键字和WHERE关键字都可以用来过滤数据,且HAVING

C语言中结构体数组怎么定义和使用?

一个结构体变量可以存放一个学生的一组信息,可是如果有10个学生呢?难道要定义10个结构体变量吗?难道上面的程序要复制和粘贴10次吗?很明显不可能,这时就要使用数组。结构体中也有数组,称为结构体数组。它

Spring MVC拦截器(Interceptor)的配置及使用

在开发一个网站时可能有这样的需求:某些页面只希望几个特定的用户浏览。对于这样的访问权限控制,应该如何实现呢?拦截器就可以实现上述需求。在Struts2框架中,拦截器是其重要的组成部分,SpringMV

Java正则表达式详解

正则表达式(RegularExpression)又称正规表示法、常规表示法,在代码中常简写为regex、regexp或RE,它是计算机科学的一个概念。 正则表达式是一个强大的字符串处理工具,可以对字

WP表示什么?

WindowsPhone(简称为WP)是微软于2010年10月21日正式发布的一款手机操作系统,初始版本命名为WindowsPhone7.0。基于WindowsCE内核,采用了一种称为Metro的用户

JavaScrip常见面试题汇总(含答案)

一、请解释JavaScript中this是如何工作的。首先:this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。匿名函数或不处于任何对象中的函数指向window。1、方法调用模式当函数

构建SNMP协议的Set请求

通过发送Get请求或Walk请求获取远程设备指定参数的值,实际上是获取远程设备中管理信息库MIB指定OID的值。为了方便对远程设备上MIB中的OID值进行管理,用户可以通过Set命令,改变设备的配置或

C++中国象棋项目视频教程(传智播客)

项目名称:基于QT实现的跨平台中国象棋软件(人机对战和网络对战) 项目介绍:中国象棋作为中国的传统游戏项目,目前在各大游戏平台中都有提供,本版本中国象棋使用了QT技术,实现跨平台的中国象棋人机对战和

JSP JSTL <c:out>标签:输出标签

标签用于将计算的结果输出到JSP页面中,该标签可以替代。 说明:是JSP使用程序代码输出表达式或变量结果的常用方式,但在JSP网页中嵌入Java程序代码已不再推荐使用,取而代之的是使用JSTL标签来

Java实例之猜数字小游戏

猜数字是一个经典的小游戏,程序先产生一个随机数,然后用户输入数字,程序将输入的数字与随机数进行对比,给出用户相应的提示信息。 本节实现了一个基于IO流的猜数字游戏,游戏中限制玩家游戏次数,游戏试玩为

PHP return:函数返回值

通过前面函数的学习我们知道,函数是一个功能集合体,可以实现某些特定的功能或运算。函数运行之后的结果保留在函数内部是没有任何意义的,所以我们需要将函数的运算结果返回到调用函数的地方。 PHP中提供了r

查询域名的WHOIS服务器

WHOIS服务器通常由域名注册商和分销商搭建。在域名注册的时候,注册人通常将信息提交给域名注册商或其分销商。因此,用户可以从域名注册商和分销商的WHOIS服务器获取域名的相关注册信息。 常用WHOI

字符数组及其定义和初始化,C语言字符数组详解

字符串的存储方式有字符数组和字符指针,我们先来看看字符数组。 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别对这些字符进行存储,即通过字符数组存储。字符

go pprof命令(Go语言性能分析命令)完全攻略

Go语言工具链中的gopprof可以帮助开发者快速分析及定位各种性能问题,如CPU消耗、内存分配及阻塞分析。 性能分析首先需要使用runtime.pprof包嵌入到待分析程序的入口和结束处。runt

PHP addslashes()和stripslashes():字符串转义与还原

在PHP编程的过程中,经常会遇到这样的问题,将数据插入到数据库时可能引起一些问题,比如出现错误或者乱码等。这是因为数据库将传入的数据中的字符解释成控制符。针对这种问题,就需要使用一种标记或者是转义这些

Java 语法1 rollback() 示例 Connectionconn=……//省略部分代码 conn.setAutoCommit(false);//先将事务设为手动提交 Statement

什么是内存交换

进程必须在内存中以便执行。不过,进程可以暂时从内存交换到备份存储,当再次执行时再调回到内存中(图1)。交换有可能让所有进程的总的物理地址空间超过真实系统的物理地址空间,从而增加了系统的多道程序程度。

java是前端还是后端?

java是前端还是后端这个问题问的其实并没有什么技术含量,但是出于还有很多的朋友对于java还不是很熟悉,对于在作java后端还要懂前端的知识不是很理解,今天就在这里来跟大家聊聊这个问题。java本身

卷积神经网络(CNN,ConvNet)及其原理详解

卷积神经网络(CNN,有时被称为ConvNet)是很吸引人的。在短时间内,它们变成了一种颠覆性的技术,打破了从文本、视频到语音等多个领域所有最先进的算法,远远超出了其最初在图像处理的应用范围。 CN