2012-01-09 47 views
14

Cả hai hoạt động như một chồng. Cả hai đều có hoạt động push và pop.Sự khác nhau chính giữa vector và ngăn xếp là gì?

Sự khác biệt trong một số bố cục bộ nhớ là gì?

+0

Ngăn xếp mặc định ngăn xếp là một deque - 'class Container = deque '. –

+0

@Chuyển mọi liên kết để hỗ trợ điều đó? Và container mặc định của vector là gì? –

+0

Đây là liên kết đến [MSDN] (http://msdn.microsoft.com/en-us/library/56fa1zk5%28v=VS.100%29.aspx). Bạn cũng sẽ nhận được một bản sao của bản thảo chuẩn C++ (http://www.open-std.org/jtc1/sc22/wg21/) có chứa các định nghĩa. Vector là một trong các thùng chứa tiêu chuẩn stl, ngăn xếp là một chuyên ngành * sử dụng một trong các thùng chứa tiêu chuẩn. –

Trả lời

11

std::vector có một số hoạt động trợ năng và sửa đổi so với std::stack. Trong trường hợp std::stack, bạn có thể phải thực hiện các thao tác theo cách có hệ thống, trong đó bạn có thể push() phía trên phần tử cuối cùng hoặc pop() phần tử cuối cùng.

std::vector linh hoạt hơn theo nghĩa đó, nơi có nhiều thao tác, trong đó bạn có thể insert() ở giữa hoặc erase() ở giữa.

Điểm chính là, std::stack cần được cung cấp vùng chứa bên dưới. Theo mặc định, nó là std::deque, nhưng cũng có thể là std::vector hoặc std::list.
Mặt khác, std::vector được đảm bảo là một mảng liền kề có thể truy cập được bằng cách sử dụng operator [].

+0

Bạn đã nói: 'Điểm chính là, std :: stack cần phải được cung cấp container bên dưới.' nhưng ví dụ này không hiển thị thêm bất kỳ nỗ lực nào trong việc cung cấp vùng chứa? http://www.cplusplus.com/reference/stl/stack/push/ –

+2

@AnishaKaul, đó là bởi vì * mặc định * nó là, 'mẫu > lớp stack;'. Vì vậy, nếu bạn không cung cấp bất kỳ vùng chứa nào, nó giả định nó là 'std :: deque'. Xem liên kết tôi đã đăng trong câu trả lời để biết thêm thông tin. – iammilind

+0

Ok, cảm ơn, thùng chứa có thể được thay đổi! Khỏe. Thùng chứa mặc định của Vector là mảng động được tạo bởi mới? –

7

stack là một ngăn xếp. Nó chỉ có thể đẩy và bật. A vector có thể làm những việc khác, như chèn vào giữa. Điều này làm tăng tính linh hoạt, nhưng làm giảm đảm bảo.

Ví dụ, đối với ngăn xếp, nếu bạn đẩy A rồi B ​​lên phía sau thì bạn được đảm bảo rằng chúng sẽ bị xóa theo thứ tự B, thì A. vector không đảm bảo điều đó.

+0

Phải, tôi chỉ thấy rằng vectơ có một hàm 'xóa 'có thể xóa khỏi các câu đố. Stack không có bất kỳ điều như vậy. :) Vì vậy, vector là một chồng linh hoạt. –

+0

@Anisha: Không, đó là một cách sai lầm để giả định. Nếu đó là trường hợp một danh sách liên kết, một mảng đơn giản, một deque tất cả có thể được gọi là một stack..rt? Nhưng stack là một tập hợp các thuộc tính được định nghĩa cho một thùng chứa hoặc một cấu trúc dữ liệu. Bạn có thể tạo một ngăn xếp trong cấu trúc dữ liệu được đề cập ở trên nếu việc triển khai của bạn vẫn đúng cho các thuộc tính được định nghĩa cho một ngăn xếp. – Arunmu

+0

@ArunMu Thực ra theo chồng tôi đang đề cập đến "vùng chứa" được gọi là ngăn xếp. –

2

Stack về cơ bản là trường hợp đặc biệt của vectơ. Về mặt lý thuyết, vector có thể phát triển theo ý muốn của bạn. Bạn có thể xóa các phần tử tại bất kỳ chỉ mục nào trong một vectơ. Tuy nhiên, trong trường hợp của một ngăn xếp, bạn có thể loại bỏ các yếu tố và chèn chúng chỉ ở đầu của nó (do đó một trường hợp đặc biệt của vector).

Đối mặt với nhiều thư viện cung cấp triển khai ngăn xếp, chúng thường được kế thừa từ lớp/cấu trúc vectơ. Tôi không chắc chắn, nhưng tôi nghĩ rằng STL (C + +) hiện nó.

+0

STL là một điều cũ; bạn có thể có nghĩa là Thư viện chuẩn. Và không, 'stack' của nó không được định nghĩa là kế thừa từ' vector'; nó là một bộ điều hợp templated mặc định là 'deque' và có thể chọn một' vector' làm tùy chọn. –

11

Tôi không biết tất cả các chi tiết triển khai, nhưng theo this, ngăn xếp là bộ điều hợp vùng chứa. Nó đảm bảo vùng chứa bên dưới, có thể là một vectơ, danh sách hoặc deque, hoạt động như một chồng, nghĩa là chỉ cho phép push và pop, và không truy cập ngẫu nhiên.

Vì vậy, một vectơ có thể hoạt động như một chồng, nhưng ngăn xếp không thể hoạt động như một vectơ, bởi vì bạn không thể chèn hoặc lấy một phần tử ở vị trí ngẫu nhiên.

+1

+1 cho ** điểm quan trọng **. STL chứa một số ** bộ điều hợp container ** mà không tuân theo các yêu cầu chung của container vì ... chúng không phải. –

0

Tôi nghĩ sự khác biệt chính là vector là vùng chứa dựa trên phạm vi. Nó có thể dễ dàng sử dụng nhờ vào các chức năng của thành viên như bắt đầu và kết thúc. Vector có thể dễ dàng bắt đầu với {} biểu mẫu. Chúng ta có thể sử dụng các tính năng mới của C++ hiện đại như các vòng lặp dựa trên phạm vi.

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

Trong khi đó không thể cho std :: stack.

+0

Nhưng những người chọn sử dụng 'std :: stack' đã biết rằng họ không quan tâm đến việc lặp lại dựa trên phạm vi; thay vào đó, họ muốn một giao diện ngắn gọn để đẩy và bật các phần tử theo thứ tự được xác định rõ ràng. –

Các vấn đề liên quan