Какой контейнер STL может расти в обоих направлениях? - PullRequest
3 голосов
/ 14 мая 2019

Учитывая итератор в начале и один за концом, есть ли контейнер в STL, который позволил бы мне динамически и одновременно заполнять данные с обоих концов, без необходимости предварительно выделять максимальный размер? Насколько я понимаю, я мог бы использовать такой шаблон, как вектор или строку, который можно динамически увеличивать в прямом направлении, используя, например, метод push_back (). Или я мог бы использовать шаблон, подобный массиву с заранее определенным размером, к которому можно обращаться как в прямом, так и в обратном направлениях одновременно, чтобы заполнить данные.

То, что я ищу, - это шаблон, который позволил бы мне гибко использовать динамически растущий контейнер, такой как вектор, и одновременно обеспечивать заполнение данных с любого конца, например, массивом. В случае с массивом между начальным и конечным итераторами существует заранее определенный промежуток (из-за фиксированного размера); Я хотел бы, чтобы этот разрыв увеличивался динамически, когда я заполняю данные одновременно с обоих концов, в случае шаблона динамического контейнера.

Ценю ваши мысли.

Спасибо

Винод

1 Ответ

6 голосов
/ 14 мая 2019

Звучит именно то, для чего была создана std :: deque (двусторонняя очередь):

Цитирование cppreference.com

std :: deque (двусторонняя очередь) - это контейнер с индексированной последовательностью, который позволяет быстро вставлять и удалять как в начале, так и в конце. Кроме того, вставка и удаление на любом конце deque никогда не лишает законной силы указатели или ссылки на остальные элементы.

Его интерфейс похож на std::vector, но эффективно позволяет дополнения к передней и задней части:

std::deque<int> dq;

dq.push_back(5);
dq.push_front(9);

std::cout << dq[0] << '\n';
std::cout << dq[1] << '\n';

Выход:

9
5
...