什么是c ++中set_difference的替代方法

时间:2011-12-26 09:52:15

标签: c++ stl set-difference

我有两个sets。他们有一些共同的元素(集合有字符串作为他们的元素)

像: set1有元素

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

set2有元素

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

我想把值“1-1”取出来 并将“1-3”重视为另一个。 我知道set_difference会为我完成这项工作。但是我如何面对set_ifference遇到的一些问题。请查看here

使用set_difference获得相同的结果还有其他选择吗?

1 个答案:

答案 0 :(得分:3)

另一种方法是将Kerrek SB did in his answer转为your question

尽管如此,理解和解决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的五个参数是否属于它所期望的类型,并允许我很快看到它们中的哪一个引起了问题,因为它们都是单独声明的语句。

一旦我解决了这个问题,我当然会重构删除不必要的变量。