Sự khác nhau của Stack và Vector trong C++?

Chả là nay em tìm hiểu về DFS BFS thì có đọc về Stack. Nhưng em chả thấy nó có sự khác biệt gì với Vector cả. Ví dụ hàm push trong Stack thì vector có push_back với độ phức tạp là O(1), tương tự hàm pop trong Stack và pop_back trong Vector, hàm top trong Stack và vector[vector.size()-1] (hoặc vector.back()) trong Vector với tất cả có độ phức tạp như nhau.
Vậy cho em hỏi lý do gì người ta lại dùng Stack trong khi ta lại có Vector - một loại container theo em thấy là tương đương và nhiều chức năng hơn vậy ạ?

cú pháp trong sáng hơn :joy:

stack là wrapper của 1 container bất kì, miễn là container đó thỏa mãn SequenceContainer và có thêm 3 hàm back(), push_back(), pop_back(). Nếu muốn mình có thể viết 1 class thỏa mãn các yêu cầu trên rồi gọi std::stack<int, MyIntContainer> là được. Mặc định C++ xài deque làm container cho stack, ngoài ra còn có thể xài vector hoặc list.

xài vector thế stack cũng được, nhưng ai cấm dev nó truy cập v[i] thay vì chỉ truy cập được phần tử ở top của stack, hay pop vị trí bậy bạ khác pop top :thinking:

6 Likes

^^ em cảm ơn bác nhiều, vậy thôi cứ xài stack cho nó giống người khác z haha

Mở rộng hơn chút xíu, thì có một nguyên tắc bất ngờ nhỏ nhất như vầy: https://en.wikipedia.org/wiki/Principle_of_least_astonishment

TL;DR: nếu bạn dùng std::stack, người khác nhìn vào sẽ biết ngay là Stack. Nếu bạn dùng std::vector như std::stack, người khác phải mất thời gian để đọc, hiểu mới biết. Chưa kể phải tốn thời gian để kiểm chứng bạn dùng đúng như stack, và không dùng các tính năng khác như @tntxtnt đã nói.

6 Likes

dạ em cảm ơn bác nhiều nha ^^

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?