web-dev-qa-db-ja.com

std :: includesは実際に何をしますか?

標準 _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';
}
_

Live on Wandbox

これは驚くべきことです。 libstdc ++とlibc ++の両方で検証しましたが、アルゴリズムライブラリの一部であることを考えると、これが標準ライブラリ実装のバグになるとは思えません。これが_std::includes_が実行されるはずのアルゴリズムではない場合、何ですか?

31
Justin

これをcpplang slackに投稿しました。 Casey Carterの回答

標準のアルゴリズムの説明に欠陥があります。その目的は、干し草の山に針のすべての要素が順番に現れるかどうかを判断することです。

[実際に実行されるアルゴリズムは次のとおりです。]「ソートされたシーケンスR1とR2の共通部分がR2に等しい場合にtrueを返します」

または、 subsequence の意味が確実であることを確認した場合:

戻り値:[first2、last2)が[first1、last1)のサブシーケンスである場合にのみtrue

ケーシー・カーターのメッセージへのリンク

30
Justin

abが含まれているかどうかを確認しようとしていると思います。aにはbは含まれませんが、bには含まれますinclude abaを交換すると、abに含まれるため、trueを返します。

私は明白な何かを見逃していないことを願っています。

_#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_を所有しているかどうかをチェックし、yesがtrueを返す場合falseを返しません。また、順序付けされていない場合、エラーがスローされます:_sequence not ordered_。

3