При использовании std :: set_intersection какой набор используется для копирования значений в целевой набор? - PullRequest
0 голосов
/ 22 декабря 2011

Я использовал 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

Ответы [ 2 ]

5 голосов
/ 22 декабря 2011

Если вы спрашиваете о 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, он просто копирует элементы первой отсортированной последовательности, которых нет во второй.

1 голос
/ 22 декабря 2011

С здесь ,

Разница двух комплектов состоит из элементов, которые присутствуют в первом сете, но не во втором.

Я не знаю ни одного случая, когда этот сайт предоставил неверную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...