簡體   English   中英

像數組一樣訪問 c++ 隊列元素

[英]Access c++ queue elements like an array

可以像數組一樣訪問隊列元素嗎? 如果不是,那么有什么類似於隊列的容器可以呢?

這是std::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];

可以像數組一樣訪問隊列元素嗎?

當然,只要底層容器(默認為雙端隊列)可以。 盡管您可能想將代碼稱為壞名...

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 等)接口。

既然您已經澄清您想要下標運算符訪問,那么答案是否定的。 隊列不是需要隨機元素訪問的數據結構。 如果您需要隨機元素訪問,請使用向量或實際數組。

答案,這取決於隊列的實現。 標准模板庫提供的隊列不會讓您通過下標運算符隨機訪問元素,因為隨機訪問的實現會破壞隊列的點。

回想一下,隊列是一種提供先進先出行為的數據結構。 這意味着你需要真正關注頭部元素,僅此而已。 一旦您需要訪問頭部旁邊的元素,您就不再有隊列。

現在這並不意味着您不能在數組/向量 class 之上實現自己的隊列,但是它不會高效,因為 arrays 和向量都不適合動態添加和刪除元素。

使用向量代替隊列。 隊列不使用 [] 運算符。

STL 以下容器可以使用 operator[] 訪問:vector、dequeue、map、bitset。

要使用的默認容器是矢量容器。 在您的情況下,出隊是最有價值的選擇(因為您希望進行隊列操作以及隨機訪問)。

查看顯示 STL 容器上可用操作的參考表: http://www.cplusplus.com/reference/stl/

確定您需要使用哪種類型的容器的圖表(在頁面底部): http://www.linuxsoftware.co.nz/cppcontainers.html

std::queue沒有隨機元素訪問,默認情況下它是一個序列容器適配器,使用std::dequeue 但是,值得注意的是,如果您使用的是微軟的編譯器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。

您可以使用類似隊列的向量,例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM