À partir de la norme, std::includes
:
Retourne:
true
si[first2, last2)
est vide ou si chaque élément de la gamme[first2, last2)
est contenue dans l'intervalle[first1, last1)
. Les retoursfalse
sinon.
Remarque: comme c'est en vertu de [alg.ensemble.opérations], les plages doivent être triés
La prise de ce littéralement, si nous les laissons R1=[first1, last1)
et R2=[first2, last2)
, ce qui est de l'évaluation:
∀a∈R2 a∈R1
Cependant, ce n'est pas ce qui est réellement évalué. Pour R1={1}
et R2={1,1,1}
, std::includes(R1, R2)
retourne 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';
}
Ce qui est surprenant. J'ai vérifié avec les deux libstdc++ et de la libc++, mais il me semble improbable que ce serait un bug dans la bibliothèque standard de mise en œuvre, considérant que cela fait partie des algorithmes de la bibliothèque. Si ce n'est pas l'algorithme qui std::includes
est censé fonctionner, c'est quoi?