簡體   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