我需要一个能够:
的STL容器1)仅存储唯一商品
2)根据项目添加到容器的时间有保证订单
因此,如果我按顺序将项目A,B和C添加到我的容器中,
始终可以通过以下网址访问 :myItems().begin()
或myItems[0]
B 始终可通过以下方式访问:
myItems.begin() + 1
或myItems[1]
C 始终可通过以下方式访问:
myItems.begin() + 2
或myItems[2]
我目前正在使用不符合需求#2的unordered_set
。如果我使用常规set
,我可以为订购指定一个小于函数但订单可能会随着新项目添加到容器中而改变。
使用常规set
,如果我插入小于A的新项目D,则无法再通过myItems.begin()
访问A.我可能错了,但这是我对集合排序如何运作的理解。
如果我使用list
,我可以在插入每个新项目后调用list::unique()
来强制执行唯一方面:
myList.sort();
myList.unique();
或者我可以将std::find
与列表或向量一起使用,并手动强制执行唯一方面:
iter = std::find(myList.begin(), myList.end(), item);
//Only add item if not already in list/vector...
if(iter == myList.end())
{
myList.push_back(item);
}
是否有更好的容器/解决方案满足我的特殊需求?
答案 0 :(得分:3)
STL中没有这样的容器,尽管您可以通过混合std::set
/ std::unordered_set
(以检查唯一性)和std::deque
(或者{{1}}来实现现有容器中的容器。用于排序的任何其他序列容器)。
Boost拥有多指数容器,如果你可以使用它并想看看它已经为你做了这个。
答案 1 :(得分:0)
在这种情况下,我更喜欢使用 std :: vector 或 std :: deque 。 std :: list 不是很好的解决方案,因为您需要按索引访问元素(列表在此操作上具有O(n)复杂性)。由于它使用块管理内存,因此 std :: deque 可能比vector更慢。但是,如果你有频繁/分散的插入,deque可以更好。
如果您需要保留添加元素的顺序,则无法执行排序/唯一;所以这个任务需要唯一性约束,可以使用 std :: set 或 unordered_map 来完成。