Boost或C ++ 11中是否有一个容器作为队列但具有独特的元素?

时间:2014-03-07 16:43:49

标签: c++ boost c++11

我正在寻找像std::queue这样的容器,它会在末尾添加元素(例如,类型为id的字段为uint的自定义类),但仅< / em>如果该对象尚未在容器内。

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

这样的容器是存在于C ++ 11中还是存在于Boost中?

2 个答案:

答案 0 :(得分:9)

这称为带有混淆的队列。天真的实现是使用这样的东西:

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;
}

一个不太天真的实现可能是以一些非平凡的方式(比如覆盖)将传入数据与队列中的数据合并,而不是仅仅删除更新。

答案 1 :(得分:1)

除了other answer之外,还有另一个例子,说明如何将std::set * std::queue组合成一个具有属性的容器寻找。

template <typename T>
class QueueUnique {
public:
    void push(T t) {
        if (set_.insert(t).second) {
            queue_.push(std::move(t));
        }
    }
    T& front() { return queue_.front(); }
    T& back() { return queue_.back(); }
    typename std::set<T>::size_type size() { return set_.size(); }
    /* More functions */
private:
    std::set<T> set_;
    std::queue<T> queue_;
};

像这样使用:

QueueUnique<int> q;
q.push(1);
q.push(1);
q.push(2);
q.push(3);
q.push(1);

std::cout << "Size: " << q.size() << std::endl;   // Size: 3
std::cout << "Front: " << q.front() << std::endl; // Front: 1
std::cout << "Back: " << q.back() << std::endl;   // Back: 3

<子> * 注意:std::set要求定义元素​​类型的运算符<