Lapoux's blog

By Lapoux, history, 3 months ago, In Russian

Некоторые новички могли после первого изучения std::stack в С++ начать писать его вместо std::vector, но это заблуждение и std::vector оптимальнее std::stack

  1. Оверхед. По умолчанию он использует deque, а не vector. Зачем вам лишние аллокации и фрагментация памяти, когда vector делает push_back и pop_back за O(1) с минимальным оверхедом?

  2. Бесполезные ограничения. Вы не можете заглянуть внутрь, кроме top(). А если вам нужен предпоследний элемент? С vector вы просто делаете v[v.size()-2] и всё. С stack вы вынуждены сначало удалять последний элемент при этом запоминая его а потом возварщать его обратно чтоб взять например предпоследний элемент.

  3. Никакой итерации. Хотите пройтись по элементам? Забудьте. А с vector вы можете спокойно пройтись по элементам.

  4. vector быстрее по скорости чем stack

  • Вот сравнение std::vector и std::stack по скорости

Вот код для стека

#include <iostream> 
#include <stack>

int main() {
    int n = 1e7;
    std::stack <int> st;

    for (int i = 0; i < n; ++i) {
        st.push(i);
    }

    long long sum = 0;
    while (!st.empty()) {
        sum += st.top();
        st.pop();
    }

    std::cout << sum;
}

Вот код с вектором

#include <iostream>
#include <vector>

int main() {
    int n = 1e7;
    std::vector <int> v;

    for (int i = 0; i < n; ++i) {
        v.push_back(i);
    }

    long long sum = 0;
    for (auto& i : v) {
        sum += i;
    }

    std::cout << sum;
}
  • Первый Код работает на моём компьютере за 0.183 секунды а второй за 0.109, что значительно лудше посравнению с результатом стэка.

Вывод: почти всегда std::vector будет лудше чем std::stack. Поэтому не советую его использовать, потому что ещё и с std::vector вы получите больший функционал.

  • Vote: I like it
  • +10
  • Vote: I do not like it