我应该使用哪个容器

时间:2016-05-09 01:36:50

标签: c++

假设我想要一个具有不同价格的苹果容器。 我希望它们按价格排序(最高价格优先),但我也希望通过他们的ID快速检索它们。到目前为止我所拥有的是以下内容

struct AppleClass
{
    string id;
    int price;

    bool operator<(const AppleClass& o) const 
    {
        return price > o.price; 
    }
};

int main() 
{
    set<AppleClass> myapples;
    myapples.insert({"apple1", 500});
    myapples.insert({"apple2", 600});
    myapples.insert({"apple3", 400});

    for (auto& apple : myapples)
    {
        cout << apple.id << "," << apple.price << endl;         
    }
}

http://ideone.com/NcjWDZ

我的应用程序将花费20%的时间删除条目,20%插入条目,25%检索它们(检索整个列表),35%更新它们(它们的价格会增加或减少)。

容器最多可包含450个条目。

我的代码只能解决排序问题。查找是无用的,因为我想通过他们的id找到(所以我需要迭代所有这些)。出于同样的原因,删除和插入会很慢。

感觉这是错误的选择。

但是如果我有一张地图,那么它将根据id进行排序。每次我检索列表时,我都必须将其复制到某个容器中,例如,订购它,然后将其发送给用户,这也感觉很慢。

帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用两个容器,一个按价格(优先级队列或链接列表)排序,另一个索引您的ID(哈希映射)。为了节省空间,您可以让两个结构只保留指向Apple实例的指针,但是您需要为此编写自定义排序函数。

这样,您的条目移除为O(1),插入为O(log n),检索也为O(1),更新为O(log n)。我认为这应该是好的,特别是当你处理这么少的物品时(450)。

编辑:

阐述运营成本:

所有这些操作都是哈希映射的常量时间,因此这与优先级队列有关:

  • 删除:如果您将插入成本推迟,则可以使用优先级队列获得O(1)的摊还成本。有很多聪明的实现可以告诉你如何做到这一点。
  • 插入:任何基本的优先级队列实现都会在O(log n)执行此操作,如果您希望不断删除时间,那么保持这种方式会有点棘手。
  • 检索:您可以使用地图,无需查看优先级队列。
  • 正在更新:我不认为(更简单)获得比O(log n)更好的复杂性更新,甚至摊销,你可能会必须在普通案例的优先级队列中随机播放。