Я использовал set_intersection из STL в C ++, и мне было интересно, есть ли какое-либо правило, по которому будет использоваться набор при создании пересечения. Или поведение не определено и потенциально зависит от реализации.
В 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