[英]C++ boost - Is there a container working like a queue with direct key access?
[英]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.