c++ - Boost 或 C++11 中是否有一个容器充当队列但具有独特的元素?

标签 c++ boost c++11

我正在寻找像 std::queue 这样的容器,它将添加元素(例如,一个自定义类,其字段 id 类型为 uint) 最后,但如果该对象尚未在容器内。

只有当 id 相等时(我重载了运算符 ==),我的类的两个元素才被认为是相等的。

C++11 或 Boost 中是否存在这样的容器?

最佳答案

这被称为混合队列。天真的实现是使用这样的东西:

std::set<your_key_t> unique;
std::queue<your_data_t> q;

void enqueue(your_data_t x) {
    if (unique.insert(x.key).second) {
        q.push(std::move(x));
    }
}

your_data_t dequeue(your_data_t dflt) {
    if (!q.empty()) {
        your_data_t x = std::move(q.front()); q.pop();
        unique.erase(q.front().key);
        return x;
    }
    else return dflt;
}

一个不太天真的实现可能是以某种重要的方式(比如覆盖)将传入的数据与队列中的数据合并,而不是仅仅丢弃更新。

关于c++ - Boost 或 C++11 中是否有一个容器充当队列但具有独特的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22255781/

相关文章:

c++ - WM 6.x 中的 GDI 路径

c++ - #define macro() <...> 做什么?

c++ - 对共享变量执行多个原子操作

c++ - 什么决定临时对象的生命周期何时扩展到 const 引用或右值引用?

c++ - first catch 捕获任何类型

C++ 可变参数模板 - NULL 转换为 int

c++ - 将自定义字符串放入文件中

c++ - std::uninitialized_copy 和 std::copy 之间的区别?

c++ - C预处理器如何将函数宏视为字符串

c++ - 在线程内使用循环时出现 "Unhandled exception"错误