【问题标题】:passing more data to std:set Comparison class将更多数据传递给 std:set 比较类
【发布时间】:2010-02-24 17:05:04
【问题描述】:

我有一个带有 Compare 类的 std::set,它需要额外的参数来比较键。这个可变参数是在运行时确定的,我将它打包到集合的键中只是为了让比较可以访问它。

但是,参数在逻辑上属于集合而不是键,所以这个解决方案看起来很尴尬,并且在所有键上都复制了相同的值。

有没有一种优雅的方法可以将附加参数传递给 Compare 类? (我首先想到的是 set::value_comp,但它在我需要引用时按值返回比较对象)。

谢谢。

【问题讨论】:

    标签: c++ stl set


    【解决方案1】:

    std::set的定义是:

    template <
          class Key, 
           class Traits=less<Key>, 
           class Allocator=allocator<Key> 
    >
    class set
    

    所以 Traits 应该是您的比较运算符,但如果要查看构造函数,您可以再次看到它:

    explicit set(
       const Traits& _Comp
    );
    

    所以只需将您的实例传递给构造函数。 (注意是复制完成的)

    【讨论】:

    • 这个答案是正确的,但我发现很难理解。澄清一下:您需要创建一个带有附加参数的比较对象,然后将该对象传递给 std::set 构造函数。集合构造完成后不要尝试修改参数。
    • @Mark Ransom - 没有灵丹妙药,如果更改排序规则,则必须重建整个集合。如果参数不影响排序顺序,则可以通过引用或指针将其传递给 Traits。
    • 没有办法重建一个集合,除了复制到一个新的,所以我坚持我的声明。当给定相同的输入集时,比较对象必须始终返回相同的值,否则该集可能会发生故障。
    • @Mark Ransom - 是的,你不能重建集合,只能过度复制。好吧,总是有两种方法:您可以将比较规则分为两部分:(1)不可变(2)取决于参数。您只能重建(通过擦除和临时复制到另一个集合)应用 std::set::equal_range (规则 1)返回的范围内的集合的一部分。之后可以使用特殊的 set::insert - 进行排序。结果你得到 O(ln(n)) 复杂度。
    • & Mark Ransom - 谢谢,伙计们!现在我明白我在这个问题上陷入僵局的真正原因是因为我正在重用具有变量比较参数的同一个集合成员。我应该做的是在调整比较对象内部的比较参数之后动态创建集合。 @Mark Ransom - 没有故障,因为我在用不同的参数重用之前清空了集合。我这样做是因为我更喜欢重用成员而不是动态分配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多