Dou*_* T. 35
这是std :: deque的理想任务.它针对添加/删除进行了优化,但也提供了对中间元素的随机访问.引用链接文章:
deque非常像向量:像vector一样,它是一个支持随机访问元素的序列,在序列末尾插入和删除元素的恒定时间,以及中间元素的线性时间插入和删除.
... deque还支持在序列开始时不断插入和删除元素
因为它可以有效地从两端添加/删除,所以deque可以作为具有push_back和pop_front方法的队列有效地使用:
std::deque<int> aDeque;
// enqueue
aDeque.push_back(1);
aDeque.push_back(2);
// dequeue
int top = aDeque.front();
aDeque.pop_front();
Run Code Online (Sandbox Code Playgroud)
访问数组之类的元素意味着使用下标运算符
deque
还支持通过下标运算符的随机访问:
std::cout << aDeque[0];
Run Code Online (Sandbox Code Playgroud)
队列元素可以像数组一样访问吗?
当然!只要底层容器(默认为 deque)这样做,尽管您可能想调用代码坏名...
template<class T, class C=std::deque<T> >
struct pubqueue : std::queue<T, C> {
using std::queue<T, C>::c;
static C& get_c(std::queue<T, C> &s) {
return s.*&pubqueue::c;
}
static C const& get_c(std::queue<T, C> const &s) {
return s.*&pubqueue::c;
}
};
template<class T, class C>
C& get_c(std::queue<T, C> &a) {
return pubqueue<T, C>::get_c(a);
}
template<class T, class C>
C& get_c(std::queue<T, C> const &a) {
return pubqueue<T, C>::get_c(a);
}
int main() {
std::queue<int> q;
q.push(42);
std::cout << get_c(q)[0] << '\n';
pubqueue<int> p;
p.push(3);
std::cout << p.c[0] << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意允许您将 std::queue 变量更改为 pubqueue 变量并直接访问容器成员的技巧。这使您可以保留 std::queue 的 push/pop(而不是 push_back/pop_front 等)接口。