【问题标题】:unique STL container with special ordering具有特殊订购的独特 STL 容器
【发布时间】:2012-11-14 09:04:32
【问题描述】:

我需要一个 STL 容器,它能够:

1) 只存储独特的项目

2) 有一个基于项目添加到容器中的时间的保证顺序

所以,如果我按顺序将项目 A、B 和 C 添加到我的容器中,

A 始终可以通过以下方式访问:myItems().begin()myItems[0]

B 始终可以通过以下方式访问: myItems.begin() + 1myItems[1]

C 将始终可以通过以下方式访问: myItems.begin() + 2myItems[2]

我目前使用的unordered_set 不能满足需求#2。如果我使用常规的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);
}

是否有更好的容器/解决方案满足我的特殊需求?

【问题讨论】:

  • 您是如何达到这些要求的?在我看来,它们是非正统的。
  • @LightnessRacesinOrbit:在我看来,这就像 FIFO 缓存的构建块。

标签: c++ stl containers


【解决方案1】:

STL 中没有这样的容器,尽管您可以通过混合std::set/std::unordered_set(检查唯一性)和std::deque(或任何其他序列容器)来实现一个与现有容器排序。

Boost 的多索引容器已经为您完成了这项工作,如果您可以使用它并想看看的话。

【讨论】:

  • 两者都使用会像这样吗? 1) 将 item 插入到set/unordered_set 2) 检查 set::insert() 返回的 pair 以查看 item 是否已存在于 set 3) 如果 item 不存在于 set 中,则添加到 deque/vector。 4) 现在我有一个手动构造的 deque\vector 具有正确排序的独特项目
  • @user974967:正确。您还需要跟踪元素的删除,以便它们从容器的两个视图中发生。根据您可能很简单的使用模式(即,如果您始终处理有序序列,则删除是对 std::set 的二进制搜索或在 std::unordered_set 中的 O(N) 查找
【解决方案2】:

在这种情况下,我更喜欢使用 std::vectorstd::dequestd::list 不是好的解决方案,因为您需要按索引访问元素(列表在此操作中具有 O(n) 复杂度)。 std::deque 在索引访问方面可能比向量慢一些,因为它使用块管理内存。但是,如果您有频繁/分散的插入,则 deque 可能会更好。

如果您需要保持添加元素的顺序,则不能排序/唯一;所以这个任务需要唯一性约束,可以使用 std::setunordered_map 来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多