使用std :: set_intersection时,哪个set用于将值复制到目标集中?

Mik*_*keT 0 c++ stl

我在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)

Cub*_*bbi 5

假设您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,它只是复制第一个排序序列中第二个不存在的元素.