可以像数组一样访问队列元素吗?如果没有,那么类似于队列的容器可以吗?
答案 0 :(得分:33)
这是std::deque的理想任务。它针对添加/删除进行了优化,但也提供了对中间元素的随机访问。引用链接的文章:
deque非常像一个 矢量:像矢量一样,它是一个序列 支持随机访问 元素,恒定时间插入和 在结束时删除元素 序列,以及中间元素的线性时间插入和删除。
... 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();
访问数组之类的元素意味着使用下标运算符
deque
也支持通过下标运算符进行随机访问:
std::cout << aDeque[0];
答案 1 :(得分:3)
可以像数组一样访问队列元素吗?
当然!只要底层容器(默认为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;
}
请注意允许您将std :: queue变量更改为pubqueue变量并直接访问容器成员的技巧。这使您可以保持std :: queue的push / pop(而不是push_back / pop_front等)接口。
答案 2 :(得分:2)
既然你已经澄清了你想要下标操作员访问,答案是否定的。队列不是一个需要随机元素访问的数据结构。如果需要随机元素访问,请使用向量或实际数组。
答案 3 :(得分:1)
答案,这取决于队列的实现。标准模板库提供的队列不会通过下标运算符随机访问元素,因为随机访问的实现会使队列点失效。
回想一下,Queue是一种提供先进先出行为的数据结构。这意味着你需要真正关注head-element,就是这样。一旦您需要访问头部旁边的元素,您就不再有队列了。
现在这并不意味着你不能在数组/向量类之上实现自己的队列,但是它不会有效,因为数组和向量都不是动态添加和删除元素的理想选择。
答案 4 :(得分:1)
使用向量而不是队列。队列不使用[]运算符。
答案 5 :(得分:1)
以下容器中的STL可以使用operator []访问: 矢量,出列,地图,bitset。
要使用的默认容器是矢量容器。在您的情况下,dequeue是最有价值的选项(因为您希望有队列操作以及随机访问)。
查看显示STL容器上可用操作的参考表: http://www.cplusplus.com/reference/stl/
确定您需要使用的容器类型的图表(位于页面底部): http://www.linuxsoftware.co.nz/cppcontainers.html
答案 6 :(得分:0)
std::queue
没有随机元素访问权限,默认情况下,它是使用std::dequeue
的序列容器适配器。但是,值得注意的是,如果您使用的是Microsoft的编译器cl
,则可以使用._Get_container()
方法,该方法可让您访问基础容器及其单个元素,例如:
std::deque<int> dq;
std::queue<int, decltype(dq)> q;
q.push(23);
q.push(90);
q.push(38794);
q.push(7);
q.push(0);
q.push(2);
q.push(13);
q.push(24323);
q.push(0);
q.push(1234);
for (int i = 0; i < q.size(); i++)
{
std::cout << q._Get_container()[i] << '\n';
}
hth。
答案 7 :(得分:0)
你可以使用像队列这样的向量,例如:
std::vector<int> v;
int i=0;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
// "dequeue"
i=v[0]; // get 1
v.erase[ v.begin() ); // remove 1 / "dequeue" 1
i=v[0]; // get 2
v.erase[ v.begin() ); // remove 2 / "dequeue" 2
i=v[0]; // get 3
v.erase[ v.begin() ); // remove 3 / "dequeue" 3
i=v[0]; // get 4
v.erase[ v.begin() ); // remove 4 / "dequeue" 4