允许快速搜索和订购的容器

时间:2015-08-26 00:28:34

标签: c++ boost stl

我一次又一次地遇到这个问题,我每次都会实施不同的方法。现在我决定看看stackoverflow社区是否可以提出更好的建议。

假设我有一个协调API,需要重新评估系统中当前的对象集 - 这可能需要一些时间。 (注意,获取对象的ID列表很快,评估很慢。)它是公共API,可以不负责任地调用协调。我想保证在最后一次调用之后重新评估系统中的每个对象,同时我不想在不需要的情况下多次重新评估任何对象。到目前为止,任何集合,有序或无序都会如此好。

这个附加要求是关键:我想轮换这些项目,以防止在协调API误用的情况下重新评估位于" top"上的相同对象。

...或者如果我有" A B C D E F"在第一次通话的系统中,我将安排:" A B C D E F"按此顺序重新评估。

假设已经评估了A B和C,并且系统中有新对象G和H:新队列应该如下所示:" D E F A B C G H"其中" D E F G H A B C"会更好,但并不重要。我不希望队列成为" A B C D E F G H"或" D E F A B C D E F G H"

问题是用什么stl或boost容器(或组合)来解决这个问题?

2 个答案:

答案 0 :(得分:0)

IMO最好的方法是,如果您需要比vectormapunordered_mapset更复杂的内容,那么您应该默认为{{1} }。多索引容器的优点是它非常强大和灵活,可以有效地支持各种查找方案,并且如果您的需求在以后变得更大,它也很容易扩展。我会首先构建整个应用程序,然后如果你计时并发现需要优化,那么尝试用适合您需要支持的特定操作的优化数据结构替换相关的多索引容器。这可以为您节省大量的开发时间,而不用担心数据结构决策。

答案 1 :(得分:0)

环是适当的数据结构,但我不知道任何标准实现。您可以使用std::list通过维护迭代器来迭代,插入和检测结尾来轻松地模拟它。

std::list<Item>* is = new std::list<Item>();

auto it = is->begin();
auto ir = is->end();

is->insert(ir, i);

if (++it == is->end())
    it = is->begin();

这会导致O(1)插入和O(1)次迭代。它每次迭代增加了额外的分支,但是可以通过适当的环来消除。