我在C++中使用STL中的set_intersection,我想知道在创建交集时是否有关于使用哪个集合的规则.或者是行为未定义,并且可能依赖于实现.
在linux上使用g ++(版本4.4.6),它似乎总是使用传递给set_difference函数的第一个集合,但我不确定我可以依赖它.从下面的示例中可以看出,每个集合成员中的其他数据在运算符<function中未被考虑.
#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
Run Code Online (Sandbox Code Playgroud)
假设您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,它只是复制第一个排序序列中第二个不存在的元素.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |