我在c++中使用STL中的set_intersection,我想知道在创建交集时是否有任何关于使用哪个集合的规则。或者行为未定义,并且可能依赖于实现。
在linux上使用g++(版本。4.4.6),似乎它总是使用传递到set_difference函数的第一个集合,但我不确定我可以依靠这一点。从下面的示例中可以看到,在每个集合成员中都有其他数据没有被运算符<函数。>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
class myClass {
public:
myClass(int val, int data)
: value(val),
metaData(data) {}
// Only consider the value, not metaData
bool operator<(const myClass &other) const{
return value < other.value;
}
void print() const {
cout << "Value: " << value << " metaData: " << metaData << endl;
}
private:
int value;
int metaData;
};
int main() {
// Create two sets with some data
set<myClass> set1;
set<myClass> set2;
set<myClass> intersect;
// Set1 has 1, 2, 3, 4
set1.insert(myClass(1,-10));
set1.insert(myClass(2,-10));
set1.insert(myClass(3,-10));
set1.insert(myClass(4,-10));
// Set2 has -1, 2, 3
set2.insert(myClass(-1, 10));
set2.insert(myClass(2, 10));
set2.insert(myClass(3, 10));
set_intersection(set1.begin(), set1.end(),
set2.begin(), set2.end(),
inserter(intersect, intersect.begin()));
for_each(intersect.begin(), intersect.end(),
mem_fun_ref(&myClass::print));
}
// The output of this code is
// Value: 2 metaData: -10
// Value: 3 metaData: -10
假设您问的是问题标题中的set_intersection
,而不是代码示例中的set_difference
, c++标准是明确的:
C++03 §25.3.5.3[lib.set.intersection]/5
如果一个元素在两个范围中都存在,则复制第一个范围中的元素
当前的标准使这一点更强,主要是为了多集,现在在等效键的顺序方面是稳定的:
C++11 §25.4.5.3[set.intersection]/5
如果
[first1,last1)
包含相互等价的m
元素,[first2, last2)
包含相互等价的n
元素,则将min(m, n)
的前一个元素按顺序从第一个范围复制到输出范围。
对于set_difference
,它只是复制第一个排序序列中没有出现在第二个排序序列中的元素。
从这里,
两个集合的差由存在的元素构成在第一组,但在第二组。
据我所知,本网站没有提供错误信息的实例