我正在寻找像std::queue
这样的容器,它会在末尾添加元素(例如,类型为id
的字段为uint
的自定义类),但仅< / em>如果该对象尚未在容器内。
只有当id
相等时,才会认为我的班级的两个元素是相等的(我已经重载了运算符==
)。
这样的容器是存在于C ++ 11中还是存在于Boost中?
答案 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
要求定义元素类型的运算符<
。
子>