2011-12-22 17 views

Trả lời

38

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.

+3

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? –

9

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.

+0

Nó sẽ xuất hiện toán tử johnbakers

+0

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 >'. –

12
map::insert 

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/

+0

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

61

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.

+3

Trong chức năng multimap, dòng này 'std :: pair range = myMap.equal_range (" test "); 'không hoạt động, bởi vì' error: 'auto' không được cho phép trong đối số mẫu'. Sử dụng 'const auto range = myMap.equal_range (" test ")' để thay thế. – vancexu

+2

mapType? Nó có phải là MapType trên dòng 4 không? –

+0

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