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

Is it bug in std::includes or am I doing something wrong

本文关键字:错了 什么 std include 错误      更新时间:2023-10-16

C++ STL includes (http://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";
    }
}

预期:"匹配">

实际:"不匹配">

我是不是搞错了什么?

它不匹配,因为"针"包含两个a但"大海捞针"只有一个a

另请参阅:std::include 实际上做了什么?;另一种声明方式是集合交集必须等于第二个集合。

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

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

我通过将阿拉斯加转换为一组来解决这个问题。

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