Đây có thể là một câu hỏi ngu ngốc, tôi khá mới đối với C++ và lập trình nói chung. Tôi muốn hiểu việc sử dụng một số container STL và với ý nghĩ đó, tôi đã tự hỏi những lợi thế của việc sử dụng std :: set vs ví dụ bằng cách sử dụng vectơ hoặc bản đồ là gì? Tôi dường như không thể tìm thấy câu trả lời rõ ràng cho câu hỏi này. Tôi nhận thấy rằng các bộ sử dụng bản đồ, nhưng tại sao không phải lúc nào cũng sử dụng bản đồ hoặc luôn sử dụng các bộ. Thay vào đó, 2 container tương tự được cung cấp. Cảm ơn trước.ưu điểm của std :: set vs vectơ hoặc bản đồ
Trả lời
Cả hai std::set
và std::map
là các vùng chứa liên kết. Sự khác biệt là std::set
chỉ chứa khóa, trong khi ở std::map
có giá trị được liên kết. Chọn một trong những khác phụ thuộc chủ yếu vào những gì nhiệm vụ trong tầm tay. Nếu bạn muốn xây dựng một từ điển của tất cả các từ xuất hiện trong văn bản, bạn có thể sử dụng std::set<std::string>
, nhưng nếu bạn cũng muốn đếm số lần mỗi từ xuất hiện (nghĩa là liên kết giá trị với khóa) thì bạn sẽ cần std::map<std::string,int>
. Nếu bạn không cần phải kết hợp số đó, nó không có ý nghĩa để có int
đó là không cần thiết.
Cảm ơn tất cả các bạn rất nhiều, đó là tất cả những gì tôi cần biết – brunodd
Nếu bạn muốn kiểm tra xem một giá trị có tồn tại trong 'bộ' hay không, nó có nhanh như kiểm tra xem một khóa tồn tại trong' bản đồ' không? – thomthom
@thomthom: Các yêu cầu là như nhau, và hầu hết các triển khai sử dụng cùng cấu trúc dữ liệu cơ bản (RB-tree) để câu trả lời là cả từ điểm lý thuyết và trong thực tế chi phí là như nhau. –
Đảm bảo độ phức tạp mong muốn nhất đối với ứng dụng của bạn, liên quan đến chèn, xóa, truy xuất, v.v.
vector
nhanh hơn để chèn và xóa ở mặt sau của vùng chứa. Bạn có thể truy cập các phần tử thông qua toán tử [].dequeue
tương tự nhưvector
nhưng tính năng chèn và xóa trước.set
chỉ có khóa trong khimap
cópair
. Cả hai thùng chứa này đều nhanh hơn để chèn và xóa ở giữa vùng chứa. Bạn cũng có thể truy cập các phần tử thông qua tìm các thuật toán STL.
một tập rất hữu ích để lưu trữ những thứ độc đáo như một enum cho "typeOfFruits"
std::set<typeOfFruits> fruits;
fruits.insert (banana);
fruits.insert (apple);
fruits.insert (pineapple);
//it's fast to know if my store sells a type of fruit.
if (fruits.find (pear) == fruits.end())
{ std::cout<<"i don't have pear"; }
một bản đồ rất hữu ích để lưu trữ những thứ độc đáo, cộng với 'giá trị' một
std::map<typeOfFruits, double /*unit price*/> fruits;
fruits[banana] = 1.05;
fruits[apple] = 0.85;
fruits[pineapple] = 3.05;
//repeating pineapple will replace the old price (value)
fruits[pineapple] = 3.35;
//it's fast to know how much a fruit costs.
std::map<typeOfFruits, double /*unit price*/> itr = fruits.find(pineapple);
if (itr != fruits.end())
{ std::cout<<"pineapples costs: $" <<itr->second; }
một vector rất hữu ích cho việc lưu trữ những thứ mà trình tự được sắp xếp (push_back()). tưởng tượng bạn đang quét trái cây của mình trong quá trình thanh toán và chương trình theo dõi quá trình quét này.
std::vector<typeOfFruits> fruits;
fruits.push_back(apple);
fruits.push_back(apple);
fruits.push_back(apple);
fruits.push_back(banana);
fruits.push_back(banana);
fruits.push_back(pineapple);
//i scanned 3 apples, 2 bananas and 1 pineapple.
Không có cơ quan nào đề cập đến sự thật là std::set
thực sự là không thay đổi. Bạn không nên thay đổi giá trị của bất kỳ phần tử nào trong đó. std::set
không theo dõi các thay đổi, do đó khi bạn chỉnh sửa một phần tử trong đó, bạn quay lại phía sau và có khả năng thay đổi thứ tự bên trong của nó. Đây là một hành vi nguy hiểm. Do đó, hãy sử dụng std::map
nếu bạn muốn chỉnh sửa các phần tử sau khi bạn đưa chúng vào vùng chứa. Đảm bảo bạn sử dụng key
để đặt hàng và mọi thứ bạn cần thay đổi sau đó vào value
.
Một 'std :: set' tương tự như một' std :: map' không có giá trị và hoàn toàn không liên quan đến 'std :: vector' ... –
Bạn cần một số [tài liệu tốt] (http: // en.cppreference.com/w/). –
Tất cả đều làm những việc khác nhau. Chọn cái mà bạn cần để giải quyết vấn đề của bạn.Nó giống như yêu cầu tại sao chúng ta nên giữ muối, bơ và đường trong nhà bếp và không chỉ luôn luôn sử dụng nước cam. –