当使用std::set_intersection时,该集合用于将值复制到目标集合中



我在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,它只是复制第一个排序序列中没有出现在第二个排序序列中的元素。

从这里,

两个集合的差由存在的元素构成在第一组,但在第二组。

据我所知,本网站没有提供错误信息的实例

相关内容

  • 没有找到相关文章