Какой набор используется для копирования значений в целевой набор при использовании std :: set_intersection?

Я использовал set_intersection из STL в C ++, и мне было интересно, существует ли какое-либо правило, по которому набор будет использоваться при создании пересечения. Или поведение не определено и потенциально зависит от реализации.

В Linux, использующем g ++ (версия 4.4.6), кажется, что он всегда использует первый набор, который передается в функцию set_difference, но я не уверен, что могу на это положиться. Как видно из приведенного ниже примера, в каждом элементе набора есть другие данные, которые не учитываются в функции operator <.

#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
0
задан MikeT 21 December 2011 в 21:30
поделиться