Подтвердить что ты не робот

Доступ к элементам очереди С++, таким как массив

Доступ к элементам очереди может быть как массив? Если нет, то какие контейнеры, похожие на очередь, могут?

4b9b3361

Ответ 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';
}

НТН.