[英]What does std::includes actually do?
返回:
true
如果[first2, last2)
是空的,或者如果在范围内的每个元素[first2, last2)
被包含在范围[first1, last1)
否则返回false
。
注意:由于这是在[alg.set.operations]下 ,因此必须对范围进行排序
从字面上看,如果我们让R1=[first1, last1)
和R2=[first2, last2)
,这就是评估:
∀a∈R2 a∈R1
但是,这不是实际评估的内容。 对于R1={1}
且R2={1,1,1}
, std::includes(R1, R2)
返回false:
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <vector>
int main() {
std::vector<int> a({1});
std::vector<int> b({1,1,1});
// Outputs 'false'
std::cout << std::boolalpha
<< std::includes(a.begin(), a.end(), b.begin(), b.end()) << '\n';
}
这是令人惊讶的。 我用libstdc ++和libc ++验证了它,但是我认为这不是标准库实现中的一个错误,因为它是算法库的一部分。 如果这不是std::includes
应该运行的算法,那是什么?
我在cpplang松弛中发布了这个, Casey Carter回应 :
标准中的算法描述是有缺陷的。 目的是确定[if]针中的每个元素按顺序出现在大海捞针中。
[它实际执行的算法是:]“如果排序的序列R1和R2的交集等于R2,则返回true”
或者,如果我们确保我们确定子序列的含义:
返回:当且仅当[first2,last2]是[first1,last1]的子序列时返回true
我相信你想检查是否a
包括b
在你的榜样, a
不包括b
,但是b
不包括a
。 如果你交换b
和a
它将返回true,因为a
包含在b
。
我希望我不会错过一些明显的东西。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> a({1});
std::vector<int> b({1,1,1});
// Outputs 'true'
std::cout << std::boolalpha
<< std::includes(b.begin(), b.end(), a.begin(), a.end()) << '\n';
}
通过使用算法我已经理解的是,当你键入includes(R2, R1)
它会检查R2
拥有R1
作为子组,如果是,则返回true
如果不返回false
。 此外,如果没有订购会抛出错误: sequence not ordered
。
与阅读标准时一样, 您必须阅读不成文字 。
专注于意图而不仅仅是信件。 (标准的措辞经常被认为是模糊的,不完整的,自我指涉的或矛盾的。)
阅读“ 28.7.6对已排序结构的设置操作[alg.set.operations] ”一节的介绍:
本子条款定义了排序结构上的所有基本集合操作。 它们还适用于包含多个等效元素副本的多集合。 该组操作的语义通过定义set_union 推广到多集以标准方式 ()以包含的每个元素的出现的最大数,set_intersection()以包含最小值, 等等 。
所以很清楚,描述中的词语includes
:
返回:如果[first2,last2]为空或者范围[first2,last2]中的每个元素都包含在[first1,last1]范围内,则返回true。 否则返回false。
必须被忽略 。 您需要先了解多个集合操作是什么,“包含”意味着两个多字节,忽略描述并在头脑中重建明显的意图。
Multiset包含:
A包含在B iff A union B = B.
集合或多集合也是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.