【问题标题】:what is the alternative to set_difference in c++c ++中set_difference的替代方法是什么
【发布时间】:2012-01-27 21:50:06
【问题描述】:

我有两个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 有什么替代方法可以达到同样的效果吗?

【问题讨论】:

  • 另一种选择是...解决您在set_difference 中遇到的问题。

标签: c++ stl set-difference


【解决方案1】:

另一种方法是自己滚动,如 Kerrek SB did in his answeryour question

也就是说,理解和解决std::set_difference() 的问题要比解决它好得多。

例如,如果我在包含 set_difference 的行上遇到涉及 templates 的长编译器错误,我会将其分解为一小部分单独的简单语句,这将使查明错误更加容易:

#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 的五个参数中的每一个是否都属于它所期望的类型,并且可以让我很快看到它们中的哪一个导致了问题,因为它们都是在单独的语句中声明的。

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

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 2020-01-25
    • 2016-08-21
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多