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

neu*_*cer 15 c++ queue stl

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

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)


Fre*_*urk 5

队列元素可以像数组一样访问吗?

当然!只要底层容器(默认为 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 等)接口。