繁体   English   中英

std :: includes实际上做了什么?

[英]What does std::includes actually do?

标准来看 std::includes

返回: 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';
}

住在Wandbox上

这是令人惊讶的。 我用libstdc ++和libc ++验证了它,但是我认为这不是标准库实现中的一个错误,因为它是算法库的一部分。 如果这不是std::includes应该运行的算法,那是什么?

我在cpplang松弛中发布了这个, Casey Carter回应

标准中的算法描述是有缺陷的。 目的是确定[if]针中的每个元素按顺序出现在大海捞针中。

[它实际执行的算法是:]“如果排序的序列R1和R2的交集等于R2,则返回true”

或者,如果我们确保我们确定子序列的含义:

返回:当且仅当[first2,last2]是[first1,last1]的子序列时返回true

链接到Casey Carter的消息

我相信你想检查是否a包括b在你的榜样, a不包括b ,但是b不包括a 如果你交换ba它将返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM