Это ошибка в std :: includes или я что-то не так делаю - PullRequest
0 голосов
/ 11 февраля 2019

C ++ STL includes (http://www.cplusplus.com/reference/algorithm/includes/) Проверка, включает ли отсортированный диапазон другой отсортированный диапазон. Возвращает true, если отсортированный диапазон [first1, last1) содержит все элементы в отсортированном диапазоне [first2, last2)

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

}

Ожидается: "соответствует"

Фактически: "не соответствует"

Я делаю какую-то ошибку?

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

На основе этой реализации двух указателей из cplusplus.com :

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

Первый указатель выдвигается, когда сопоставляется один символ.Поэтому вам нужно два a символа, так как в Alaska.

есть два из них. Дополнительный a в векторе дает желаемый результат:

vector<char>secondRowInKeyboard{'a','a','A','s','S','d','D','f','F','g','G','h','H','j','J','k','K','l','L' };
0 голосов
/ 11 февраля 2019

Спасибо за ваши ответы.Это помогло мне понять мою ошибку.

Я решил эту проблему, преобразовав Аляску в набор.

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 голосов
/ 11 февраля 2019

Это не соответствует, потому что «игла» содержит два a, а «стог сена» имеет только один a.

См. Также: Что на самом деле делает std :: includes? ;другой способ заявить, что пересечение множества должно равняться второму набору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...