它是在错误的std ::包括还是我做错了什么

问题描述 投票:2回答:3

C ++ STL includeshttp://www.cplusplus.com/reference/algorithm/includes/)测试来分类的范围中是否包括另一排序的范围如果有序范围[first1,last1)包含在排序范围[所有元素,则返回true 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";
    }

}

预计:“匹配”

实际:“不匹配”

我是不是做一些错了吗?

c++ stl
3个回答
3
投票

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

参见:What does std::includes actually do?;另一种方式来说明它是在set intersection必须等于第二组。


1
投票

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

1
投票

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

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

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

}
© www.soinside.com 2019 - 2024. All rights reserved.