Tôi thấy rằng chúng có một khóa và nhiều giá trị là duy nhất.
Câu trả lời:
Multimap lưu trữ các cặp (khóa, giá trị) trong đó cả khóa và giá trị có thể xuất hiện nhiều lần.
Di map<key, set<value>>
chúc chỉ lưu trữ mỗi giá trị một lần cho một khóa cụ thể. Để làm được điều đó, nó sẽ phải có khả năng so sánh các giá trị, không chỉ các khóa.
Nó phụ thuộc vào ứng dụng của bạn nếu các giá trị so sánh bằng nhau là tương đương hoặc nếu bạn muốn lưu trữ chúng riêng biệt. Có lẽ chúng chứa các trường khác nhau nhưng không tham gia vào việc so sánh cho tập hợp.
std::multimap<key, value>
cho phép cùng một khóa xuất hiện nhiều lần trong khi std::map<key, whatever>
yêu cầu tính duy nhất của key
.
A std::map
là một vùng chứa liên kết, cho phép bạn có một khóa duy nhất được liên kết với giá trị kiểu của bạn. Ví dụ,
void someFunction()
{
typedef std::map<std::string, int> MapType;
MapType myMap;
// insertion
myMap.insert(MapType::value_type("test", 42));
myMap.insert(MapType::value_type("other-test", 0));
// search
auto it = myMap.find("test");
if (it != myMap.end())
std::cout << "value for " << it->first << " is " << it->second << std::endl;
else
std::cout << "value not found" << std::endl;
}
A std::multimap
bằng a std::map
, nhưng các khóa của bạn không còn là duy nhất nữa. Do đó, bạn có thể tìm thấy một loạt các mặt hàng thay vì chỉ tìm một mặt hàng duy nhất. Ví dụ,
void someFunction()
{
typedef std::multimap<std::string, int> MapType;
MapType myMap;
// insertion
myMap.insert(MapType::value_type("test", 42));
myMap.insert(MapType::value_type("test", 45));
myMap.insert(MapType::value_type("other-test", 0));
// search
std::pair<auto first, auto second> range = myMap.equal_range("test");
for (auto it = range.first; it != range.second; ++it)
std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}
Các std::set
giống như một std::map
, nhưng nó không được lưu trữ một chìa khóa liên quan đến một giá trị. Nó chỉ lưu trữ loại khóa và đảm bảo với bạn rằng nó là duy nhất trong bộ.
Bạn cũng có std::multiset
, theo cùng một mô hình.
Tất cả các vùng chứa này cung cấp quyền truy cập O (log (n)) với find / equal_range của chúng.
std::pair<auto first, auto second> range = myMap.equal_range("test");
này không hoạt động, bởi vì error: 'auto' not allowed in template argument
. Sử dụng const auto range = myMap.equal_range("test")
thay thế.
map::insert
Bởi vì vùng map
chứa không cho phép các giá trị khóa trùng lặp, thao tác chèn sẽ kiểm tra từng phần tử được chèn xem liệu phần tử khác đã tồn tại trong vùng chứa với cùng giá trị khóa hay chưa, nếu có thì phần tử không được chèn và giá trị được ánh xạ của nó không bị thay đổi theo bất kỳ cách nào.
Mặt khác
multimap::insert
có thể chèn bất kỳ số lượng mục nào bằng cùng một khóa.
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
Cái sau yêu cầu các giá trị có thể được sắp xếp (thông qua operator<
hoặc một hàm so sánh), cái trước thì không.
T
là không có thứ tự. Bạn có thể sử dụng nó để tạo một std::multimap<U, T>
, nhưng bạn không thể sử dụng để tạo một std::map<U, std::set<T> >
.