Доступ к элементам очереди может быть как массив? Если нет, то какие контейнеры, похожие на очередь, могут?
Доступ к элементам очереди С++, таким как массив
Ответ 1
Это идеальная задача для 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];
Ответ 2
Доступ к элементам очереди может быть как массив?
Конечно! Пока основной контейнер (который по умолчанию имеет значение 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 для изменения переменных и просто обращаться к члену контейнера напрямую. Это позволяет вам поддерживать интерфейс push/pop (вместо push_back/pop_front и т.д.) Std:: queue.
Ответ 3
Поскольку вы уточнили, что хотите получить доступ к оператору индексирования, ответ будет отрицательным. Очереди не являются структурой данных, которая когда-либо требовала бы случайного доступа к элементам. Если вам нужен случайный доступ к элементу, используйте вектор или фактический массив.
Ответ 4
Ответ, это зависит от реализации очереди. Очередь, предоставляемая стандартной библиотекой шаблонов, не дает вам случайного доступа к элементам через оператор индекса, поскольку реализация произвольного доступа поражает точку очереди.
Напомним, что Очередь - это структура данных, которая обеспечивает поведение первого в первом. Это означает, что вам нужно действительно заботиться о элементе head-element, и это все. Когда вам нужен доступ к элементам рядом с головой, у вас больше нет очереди.
Теперь это не означает, что вы не можете реализовать свою собственную очередь поверх класса array/vector, однако это не будет эффективно, поскольку как массивы, так и векторы не идеальны для динамического добавления и удаления элементов.
Ответ 5
Вместо очереди используйте вектор. В очереди не используется оператор [].
Ответ 6
Из STL следующих контейнеров можно использовать оператор [] access: вектор, dequeue, map, bitset.
Используемый по умолчанию контейнер - это векторный контейнер. В вашем случае dequeue является наиболее ценным вариантом (поскольку вы хотите иметь операции с очередью, а также произвольный доступ).
Посмотрите на справочный лист, который показывает доступные операции с контейнерами STL: http://www.cplusplus.com/reference/stl/
Диаграмма для определения того, какой тип контейнера вам нужно использовать (внизу страницы): http://www.linuxsoftware.co.nz/cppcontainers.html
Ответ 7
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';
}
НТН.