C ++ STL inclut ( http: //www.cplusplus .com / reference / algorithm / includes / ) Teste si la plage triée comprend une autre plage triée
Renvoie vrai si la plage triée [premier1, dernier1) contient tous les éléments de la plage triée [premier2, dernier2)
void Test_STL_Includes() {
vector<char>secondRowInKeyboard{ 'a','A','s','S','d','D','f','F','g','G','h','H','j','J','k','K','l','L' };
sort(secondRowInKeyboard.begin(), secondRowInKeyboard.end());
string s("Alaska");
sort(s.begin(), s.end());
if (includes(secondRowInKeyboard.begin(), secondRowInKeyboard.end(), s.begin(), s.end()))
{
cout << "Matches";
}
else
{
cout << "Not Matches";
}
}
Attendu: "Correspondances"
Réel: " Ne correspond pas "
Est-ce que je fais une erreur?
3 Réponses :
Cela ne correspond pas car "l'aiguille" contient deux a mais la "botte de foin" n'a qu'un seul a .
Voir aussi: Que fait réellement std :: includes? ; une autre façon de le dire est que l ' intersection d'ensemble doit être égal au deuxième ensemble.
Basé sur cette implémentation à deux pointeurs de cplusplus.com :
vector<char>secondRowInKeyboard{'a','a','A','s','S','d','D','f','F','g','G','h','H','j','J','k','K','l','L' };
Le premier pointeur est poussé quand un caractère correspond. Vous avez donc besoin de deux caractères a car il y en a deux dans Alaska.
Un a supplémentaire dans le vecteur vous permet d'obtenir le résultat souhaité:
template <class InputIterator1, class InputIterator2>
bool includes (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2)
{
while (first2!=last2) {
if ( (first1==last1) || (*first2<*first1) ) return false;
if (!(*first1<*first2)) ++first2;
++first1;
}
return true;
}
Merci pour vos réponses. Cela m'a aidé à comprendre mon erreur.
J'ai résolu ce problème en convertissant l'Alaska en un ensemble.
void Test_STL_Includes() {
vector<char>secondRowInKeyboard{ 'a','A','s','S','d','D','f','F','g','G','h','H','j','J','k','K','l','L' };
sort(secondRowInKeyboard.begin(), secondRowInKeyboard.end());
string s("Alaska");
set<char> temp(s.begin(), s.end());
if (includes(secondRowInKeyboard.begin(), secondRowInKeyboard.end(), temp.begin(), temp.end()))
{
cout << "Matches";
}
else
{
cout << "Not Matches";
}
}