2
votes

Est-ce un bogue dans std :: includes ou est-ce que je fais quelque chose de mal

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?


0 commentaires

3 Réponses :


3
votes

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.


0 commentaires

1
votes

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;
}


0 commentaires

1
votes

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";
    }

}


0 commentaires