Tôi thấy rằng chúng có một khóa và nhiều giá trị duy nhất.Sự khác nhau giữa std :: multimap <key, value> và std :: map <key, std :: set <value>>
Trả lời
Cặp cửa hàng nhiều giá trị (khóa, giá trị) trong đó cả khóa và giá trị có thể xuất hiện nhiều lần.
map<key, set<value>>
sẽ chỉ lưu trữ từng giá trị một lần cho một khóa cụ thể. Để làm điều đó, nó sẽ phải có khả năng so sánh các giá trị, không chỉ các phím.
Tùy 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 vẫn muốn lưu trữ chúng một cách riêng biệt. Có lẽ chúng chứa các trường khác nhau nhưng không tham gia so sánh cho tập hợp.
Sau đó yêu cầu các giá trị có thể được đặt hàng (hoặc thông qua operator<
hoặc một hàm so sánh), cái cũ thì không.
Nó sẽ xuất hiện toán tử
Có, nhưng câu trả lời của tôi đề cập đến thứ tự của các giá trị. Giả sử bạn có một loại 'T' không có thứ tự. Bạn có thể sử dụng nó để tạo một 'std :: multimap ', nhưng bạn không thể sử dụng để tạo một 'std :: map >'. –
map::insert
Vì map
container không cho phép cho các giá trị khóa trùng lặp, kiểm tra hoạt động chèn cho mỗi phần tử chèn dù yếu tố khác đã tồn tại trong container với giá trị khóa tương tự nếu như vậy, yếu tố này không được chèn vào và ánh xạ của nó giá trị không 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 có khóa tương tự.
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
Liên kết tốt về cả sự khác biệt và cách hoạt động bên trong. [link] (http: //www.ccplusplus.com/2014/02/how-map-and-multimap-works-c.html) – Rndp13
Một std::map
là nơi chứa kết hợp, cho phép bạn có một khóa duy nhất gắn liền 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;
}
Một std::multimap
bằng một std::map
, nhưng các phím của bạn không phải là độc đáo nữa. Do đó bạn có thể tìm thấy một loạt các mục thay vì chỉ tìm một mục 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 tập hợp.
Bạn cũng có std::multiset
, theo cùng một mẫu.
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.
Trong chức năng multimap, dòng này 'std :: pair
mapType? Nó có phải là MapType trên dòng 4 không? –
không chắc chắn ai là người đầu tiên, nhưng một rõ ràng là bản sao của người khác: https://www.cppbuzz.com/What-is-difference-between-map-and-multimap – user463035818
Vì vậy, một tiêu chuẩn :: multimap giống như một std :: map >, sự khác biệt giữa chúng là các giá trị của sau này được sắp xếp. Có đúng không? –