假设我想要一个包含不同价格苹果的容器。 我希望它们总是按价格排序(最高价格优先),但我也希望能够快速通过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;
}
}
我的应用程序会消耗20%的时间来删除记录,20%的时间来插入记录,25%的时间来检索它们(检索整个列表),以及35%的时间来频繁地更新记录(价格增加或减少)。
容器最多只能容纳450个记录。
我的代码只解决了排序问题。查找无意义,因为我需要按id查找(所以我需要遍历它们所有)。由于同样的原因,删除和插入操作也会很慢。
这感觉像是错误的选择。
但如果我有一个映射表,那么它将基于ID进行排序。每次检索列表时,我都需要将其复制到某个容器中,例如,对其进行排序,然后再将其发送给用户,这也感觉很慢。
求助!
std::vector
,并维护两个副本 - 一个按价格排序,另一个按ID排序。此外,不要使用id
作为const char *
,而是使用std::string
。这允许在运行时设置ID(例如基于用户输入),而不需要字符串字面值。 - Peterset
的快速索引,例如std::map<std::string, std::set<AppleClass>::iterator>
。boost提供了一个多索引容器库来简化这个过程。 - Tony Delroy