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";
}
}
预期:“比赛”
实际:“不匹配”
我犯错了吗?
答案 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' };