В чем основная разница между вектором и стеком? - PullRequest
19 голосов
/ 09 января 2012

Оба действуют как стек.Оба имеют операции push и pop.

Разница в некоторых схемах памяти?

Ответы [ 6 ]

16 голосов
/ 09 января 2012

std::vector имеет несколько операций доступа и модификации по сравнению с std::stack.В случае std::stack вам, возможно, придется выполнять операции только систематическим образом, когда вы можете push() над последним элементом или pop() последним элементом.

std::vector более гибок в этомсмысл, когда он имеет несколько операций, где вы можете insert() между ними или erase() между ними.

Важным моментом является то, что std :: stack необходимобудет предоставлен базовый контейнер .По умолчанию это std::deque, но также может быть std::vector или std::list.
С другой стороны, std::vector гарантированно является непрерывным массивом, доступ к которому можно получить с помощью operator [].

13 голосов
/ 09 января 2012

Я не знаю всех деталей реализации, но согласно это , стек является контейнерным адаптером. Он гарантирует, что нижележащий контейнер, который может быть вектором, списком или деком, работает как стек, то есть разрешает только push и pop, а не произвольный доступ.

Итак, вектор может работать как стек, но стек не может работать как вектор, потому что вы не можете вставить или получить элемент в произвольной позиции.

9 голосов
/ 09 января 2012

stack - это стек. Это может только толкать и хлопать. A vector может делать другие вещи, такие как вставка в середину. Это увеличивает гибкость, но уменьшает гарантии.

Например, для стека, если вы нажимаете A, затем B на заднюю часть, тогда вы гарантированно удалите их в порядке B, тогда A. vector не гарантирует этого.

2 голосов
/ 09 января 2012

Стек - это в основном частный случай вектора. Теоретически говорящий вектор может расти как угодно. Вы можете удалить элементы по любому индексу в векторе. Однако в случае стека вы можете удалять элементы и вставлять их только в верхнюю часть (отсюда и особый случай вектора).

На самом деле во многих библиотеках, которые предоставляют реализацию стека, они обычно наследуются от векторного класса / структур. Я не уверен, но я думаю, что STL (C ++) делает это.

0 голосов
/ 14 марта 2018

Как cplusplus.com предлагает:

Стеки - это тип адаптера контейнера, специально разработанный для работы в контексте LIFO (последний пришел-первый вышел), гдеэлементы вставляются и извлекаются только с одного конца контейнера.

Ключевое слово здесь only , так как в элементах only вставляется и извлекается изодин конец контейнера.

Вы говорите, что векторы и стеки действуют как стеки, но это только частично верно.Векторы могут действовать как стеки, но они также могут очень сильно отличаться от стеков, позволяя выполнять такие операции, как вставка по любому индексу, доступ к любому элементу, итерация по всей структуре и т. Д.

Стеки берут контейнер (такой как, например, вектор) и разрешают только стековые взаимодействия с ним.Это фактически гарантирует, что все взаимодействия с контейнером будут подчиняться LIFO: только последний добавленный элемент в контейнере будет доступен или удален.

Если вы хотите, чтобы контейнер имел стекоподобное поведение, вам следуетиспользуйте стек, если вам особенно важно, чтобы он вел себя исключительно как стек.Вы должны использовать вектор, если вы хотите иметь поведение, подобное стеку, но также можете выполнять такие вещи, как перебор элементов или изменение элементов в произвольных позициях и т. Д.

0 голосов
/ 18 января 2017

Я думаю, что основным отличием является то, что вектор является контейнером на основе диапазона.Его можно легко использовать благодаря функциям-членам, таким как начало и конец.Вектор можно легко инициировать с помощью формы {}.Мы можем использовать новые возможности современного C ++, такие как циклы на основе диапазона.

vector<int> vec{ 7, 3, 1, 9, 5 };
for ( auto &i : vec ) {
    std::cout << i << std::endl;
}

В то время как это невозможно для std :: stack.

...