include()是一个非常有用的STL函数,它检查已排序的范围是否包括另一个已排序的范围。换句话说,它有助于检查一个集合是否是另一个集合的子集,或者不考虑该集合是有序的。不用说,两个范围/组都必须以相同的方式排序,即,要么以升序要么都以降序排序。否则,它将无法检测。
它有两种用法:
语法:
bool includes( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
哪里,
InputIterator1 first1-容器的起始范围,其中包括
InputIterator1 last1-容器的结束范围,其中包括
InputIterator2 first2-将包含的容器的起始范围
InputIterator2 last2-将包含的容器的起始范围
因此,基本上[first1,last1]限定容器,其中将包括内容和[first2,last2]定义了其内容将被包括在容器中。
如果container1包含容器2,则该函数返回true,否则返回False。由于使用了默认比较器,因此如果(!(a <b)&&!(b <a)),则将两个元素a和b视为等效。
例如:
如果container1为[3、5、7、9],container2为[5、9],则container1包含container2,因此include函数将返回true;否则,返回true。
但是,如果容器为[9,5],它将被重新设置为false,因为当找到9时,容器1中已经覆盖了该范围,那么容器1中的9之后便没有5。此外,如果容器2为[5,8],它将返回false,因为container1根本不包含容器8。
下面是实现:
情况1:arr1 = [3,5,7,9],arr2 = [5,9]
#include <bits/stdc++.h> using namespace std; int main(){ vector<int> arr1{ 3, 5, 7, 9 }; vector<int> arr2{ 5, 9 }; if (includes(arr1.begin(), arr1.end(), arr2.begin(), arr2.end())) cout << "arr1 contains arr2\n"; else cout << "arr1 doesn't contain arr2\n"; return 0; }
输出:
arr1 contains arr2
情况2:arr2 = [3,5,7,9],arr2 = [9,5]
#include <bits/stdc++.h> using namespace std; int main(){ vector<int> arr1{ 3, 5, 7, 9 }; vector<int> arr2{ 9, 5 }; if (includes(arr1.begin(), arr1.end(), arr2.begin(), arr2.end())) cout << "arr1 contains arr2\n"; else cout << "arr1 doesn't contain arr2\n"; return 0; }
输出:
arr1 doesn't contain arr2
情况3:arr2 = [3,5,7,9],arr2 = [5,8]
#include <bits/stdc++.h> using namespace std; int main(){ vector<int> arr1{ 3, 5, 7, 9 }; vector<int> arr2{ 5, 8 }; if (includes(arr1.begin(), arr1.end(), arr2.begin(), arr2.end())) cout << "arr1 contains arr2\n"; else cout << "arr1 doesn't contain arr2\n"; return 0; }
输出:
arr1 doesn't contain arr2
我们还可以使用用户定义的比较器来扩展include()函数的用法。
include的语法为:
bool includes( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp );
其中所有参数均与以前相同,只是附加参数是用户定义的比较器函数。如果(!comp(a,b)&&!comp(b,a))为true / ,则认为两个元素a&b相等。
我们可以通过一个示例说明对用户定义比较器的需求。
假设我们的元素不是任何原始数据类型,而是某些用户定义的数据类型。在这些情况下,要比较两个对象(元素),我们需要编写用户定义的比较器。
下面的例子是类结构:
class student { int score; int roll; string name; public: student() { score = 0; roll = 0; name = ""; } student(int sc, int ro, string nm) { score = sc; roll = ro; name = nm; } int get_score() { return score; } int get_roll() { return roll; } string get_name() { return name; } };
在上述情况下,我们无法使用'<'或'>'运算符进行比较。而是我们需要用户定义的比较器可能类似于:
bool comp(student a, student b) { //如果所有细节都相同,则两个元素都相同,否则为false- if (a.get_name() == b.get_name() && a.get_score() == b.get_score() && a.get_roll() == b.get_roll()) return false; return true; }
现在,您一定想知道为什么当所有详细信息匹配时我们返回false。这是因为如果!comp(a,b)&&!comp(b,a)认为两个对象a和b相同。现在可以根据您的用例扩展逻辑。