在C ++中定义和搜索相关订单的集合

时间:2016-11-15 09:50:00

标签: c++ data-structures containers binary-search-tree

我有一组n个对象。每个对象都有2个数字属性AB。 我知道AB上的订单完全相关:obj1.A > obj2.A当且仅当obj1.B > obj2.B

如果我将集合实现为按A排序的集合, 我可以在O(log n)中支持以下操作:

  • 插入
  • 删除
  • A
  • 上的lower_bound

但在属性std::lower_bound上搜索B将是线性的,因为集合不支持RandomAccessIterators。 我知道我可以定义自己的二叉树实现(例如:红黑或AVL),它将在每个节点中存储AB值。通过这种方式,我可以为所有4个操作O(log n)

是否有更简单(更高级别)的方法来有效支持4个操作(搜索属性,插入和删除)?

2 个答案:

答案 0 :(得分:1)

我在评论中絮絮叨叨的一个例子:

#include <set>
#include <iostream>

namespace test {
    struct test {
        int A;
        int B;
    };

    bool operator< (test const& lhs, test const& rhs) {
        return lhs.A < rhs.A;
    }

    struct test_B { double B; };

    bool operator< (test const& lhs, test_B const& rhs) {
        return lhs.B < rhs.B;
    }

    bool operator< (test_B const& lhs, test const& rhs) {
        return lhs.B < rhs.B;
    }
}

int main() {

    std::set<test::test, std::less<void>> example {
     {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}
    };

    std::cout << example.lower_bound<test::test_B>({3.5})->B;

    return 0;
}

c ++ 14允许集合在可以与其密钥进行比较的任何内容上调用lower_bound。现在,我所做的只是创建一个与我的原始结构相当的包装类型,但它会查看B值。实际上,我set::lower_bound默认B而不是A

由于你的数字键是相关的,我怀疑你会得到lower_bound的承诺集合性能。

您可以查看here

答案 1 :(得分:1)

我建议使用boost multi-index在容器中包含多个索引。

请参阅Multiple sorts on a single set教程。