что является альтернативой set_difference в c ++ - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть два sets. У них есть некоторые общие элементы (в наборах есть строки как их элементы)

как: set1 имеет элементы

"1-2","1-1","3-4"

set2 имеет элементы

"1-2","1-3","3-4"

я хочу вынести значения "1-1" в один набор и значение "1-3" в другое. Я знаю, что set_difference сделает всю работу за меня. Но некоторые, как я сталкиваюсь с некоторыми проблемами с set_ifference. Пожалуйста, проверьте здесь

Есть ли альтернатива использованию set_difference для достижения тех же результатов?

1 Ответ

3 голосов
/ 27 декабря 2011

Альтернативой было бы бросить свой собственный, как Kerrek SB сделал в своем ответе на ваш вопрос .

Тем не менее, было бы гораздо лучшепонять и решить возникшую проблему с помощью std::set_difference(), а не обходить ее.

Например, если я получаю длинные ошибки компилятора, включающие templates в строке, содержащей set_difference, Я бы разбил это на небольшую серию отдельных простых операторов, которые значительно упростят определение ошибки:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
#include <string>

int main()
{
    typedef std::set<std::string> set_of_strings;
    set_of_strings s1, s2, result;

    s1.insert("1-2");
    s1.insert("1-1");
    s1.insert("3-4");

    s2.insert("1-2");
    s2.insert("1-3");
    s2.insert("3-4");

    // Temporary variables for debugging only
    set_of_strings::iterator s1_begin = s1.begin();
    set_of_strings::iterator s1_end = s1.end();
    set_of_strings::iterator s2_begin = s2.begin();
    set_of_strings::iterator s2_end = s2.end();
    set_of_strings::iterator result_end = result.end();
    std::insert_iterator<set_of_strings> result_inserter = std::inserter(result, result_end);

    std::set_difference(s1_begin, s1_end,
                        s2_begin, s2_end,
                        result_inserter);

    std::copy(result.begin(),
              result.end(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
}

Затем компилятор проверит, что каждый из пяти параметров set_differenceотносится к тому типу, который он ожидает, и позволит мне довольно быстро увидеть, кто из них вызывает проблему, поскольку все они объявлены в отдельных выражениях.

Как только я решу проблему, я проведу рефакторингудалить ненужные переменные, конечно.

...