像数组一样访问c ++队列元素

时间:2011-05-04 01:26:18

标签: c++ stl queue

可以像数组一样访问队列元素吗?如果没有,那么类似于队列的容器可以吗?

8 个答案:

答案 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