是std :: includes中的错误,还是我做错了什么

时间:2019-02-11 01:14:17

标签: c++ stl

C ++ STL includeshttp://www.cplusplus.com/reference/algorithm/includes/)测试排序范围是否包括另一个排序范围 如果排序范围[first1,last1)包含排序范围[first2,last2)中的所有元素,则返回true

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 :(得分:3)

它不匹配,因为“针”包含两个a,但“干草堆”仅包含一个a

另请参见:What does std::includes actually do?;另一种陈述方式是set intersection必须等于第二组。

答案 1 :(得分:1)

感谢您的回答。它帮助我理解了我的错误。

我通过将Alaska转换为集合解决了这个问题。

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

}

答案 2 :(得分:0)

基于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' };