標準 _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';
}
_
これは驚くべきことです。 libstdc ++とlibc ++の両方で検証しましたが、アルゴリズムライブラリの一部であることを考えると、これが標準ライブラリ実装のバグになるとは思えません。これが_std::includes
_が実行されるはずのアルゴリズムではない場合、何ですか?
これをcpplang slackに投稿しました。 Casey Carterの回答 :
標準のアルゴリズムの説明に欠陥があります。その目的は、干し草の山に針のすべての要素が順番に現れるかどうかを判断することです。
[実際に実行されるアルゴリズムは次のとおりです。]「ソートされたシーケンスR1とR2の共通部分がR2に等しい場合にtrueを返します」
または、 subsequence の意味が確実であることを確認した場合:
戻り値:[first2、last2)が[first1、last1)のサブシーケンスである場合にのみtrue
a
にb
が含まれているかどうかを確認しようとしていると思います。a
にはb
は含まれませんが、b
には含まれますinclude a
。 b
とa
を交換すると、a
がb
に含まれるため、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
_。