我比较两个 std::set
#include <cstdlib>
#include <cstdio>
using namespace std;
#include <vector>
#include <set>
int main(int argc, char** argv)
{
int myints1[]= {10,20,30,40,50};
int myints2[]= {50,40,30,20,10};
std::set<int> s1 (myints1,myints1+5);
std::set<int> s2(myints2,myints2+5);
if(s1==s2){
printf("sets: true");
}else printf("sets: false");
std::set<int>::iterator it2=s2.begin();
for(std::set<int>::iterator it1=s1.begin();it1!=s1.end();it1++){
printf("\ns1: %d s2: %d",*it1,*it2);
it2++;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
sets: true
s1: 10 s2: 10
s1: 20 s2: 20
s1: 30 s2: 30
s1: 40 s2: 40
s1: 50 s2: 50
Run Code Online (Sandbox Code Playgroud)
题:
这是正确的方法吗?或者是比较两组的任何其他(特殊)方式?
Yuu*_*shi 42
是的,operator==正确定义了所有标准容器(无序容器除外 - 基于标准的23.2.5.2),并且通常会进行字典比较.例如,请参见此处.相关报价:
检查lhs和rhs的内容是否相等,即lhs.size()== rhs.size()和lhs中的每个元素在同一位置的rhs中是否具有等效元素.
由于std::set是一个有序的容器,任何具有相同大小和相同元素的集合(给定比较器是相同的)必然会将它们放在相同的位置,因此将比较相等.
WiS*_*GaN 21
C++标准库头中有几个set操作<algorithm>.
std::set_difference 给出第1组但不是第2组的元素.
std::set_intersection 给出两组中的元素.
std::set_symmetric_difference 给出那些出现在其中一个集合中的元素,但不是两个集合.
std::set_union 给出集合1或集合2中的元素.
上述算法也可以应用于除STL之外的STL容器std::set,但容器必须先排序(std::set默认排序).
另一种方式是这样的:
template<typename Set>
bool set_compare(Set const &lhs, Set const &rhs){
return lhs.size() == rhs.size()
&& equal(lhs.begin(), lhs.end(), rhs.begin());
}
Run Code Online (Sandbox Code Playgroud)
灵感来自这里优雅的答案。