อะไรคือความแตกต่างระหว่าง std :: multimap <key, value> และ std :: map <key, std :: set <value>>


คำตอบ:


52

มัลติแมปเก็บคู่ของ (คีย์ค่า) ซึ่งทั้งคีย์และค่าสามารถปรากฏได้หลายครั้ง

map<key, set<value>>จะเก็บค่าแต่ละครั้งสำหรับคีย์ที่เฉพาะเจาะจง ในการทำเช่นนั้นจะต้องสามารถเปรียบเทียบค่าได้ไม่ใช่แค่คีย์เท่านั้น

ขึ้นอยู่กับแอปพลิเคชันของคุณว่าค่าที่เปรียบเทียบเท่ากันมีค่าเท่ากันหรือหากคุณต้องการจัดเก็บแยกต่างหาก บางทีอาจมีช่องที่แตกต่างกัน แต่ไม่ได้มีส่วนในการเปรียบเทียบชุด


5
ดังนั้น std :: multimap <key, value> จึงเหมือนกับ std :: map <key, std :: multiset <value>> ความแตกต่างระหว่างค่าเหล่านี้คือการเรียงลำดับค่าในภายหลัง นั่นถูกต้องใช่ไหม?
大宝剑

2
ไม่std::multimap<key, value>อนุญาตให้คีย์เดียวกันปรากฏให้เห็นหลายครั้งในขณะที่ต้องมีเอกลักษณ์ของstd::map<key, whatever> key
Yixing Liu

75

A std::mapเป็นคอนเทนเนอร์ที่เชื่อมโยงซึ่งช่วยให้คุณมีคีย์เฉพาะที่เชื่อมโยงกับค่าประเภทของคุณ ตัวอย่างเช่น,

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เท่ากับ a std::mapแต่คีย์ของคุณจะไม่ซ้ำกันอีกต่อไป ดังนั้นคุณจึงสามารถค้นหาไอเท็มมากมายแทนที่จะหาไอเท็มที่ไม่ซ้ำใคร ตัวอย่างเช่น,

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;
}

std::setเป็นเหมือนstd::mapแต่มันก็ไม่ได้จัดเก็บที่สำคัญที่เกี่ยวข้องกับค่า จะเก็บเฉพาะประเภทคีย์และรับรองว่าไม่ซ้ำกันภายในชุด

คุณยังมีstd::multisetที่เป็นไปตามรูปแบบเดียวกัน

คอนเทนเนอร์ทั้งหมดเหล่านี้ให้การเข้าถึง O (log (n)) ด้วย find / equal_range


6
ในฟังก์ชันมัลติแมปบรรทัดนี้ใช้std::pair<auto first, auto second> range = myMap.equal_range("test");ไม่ได้เนื่องจากerror: 'auto' not allowed in template argument. ใช้const auto range = myMap.equal_range("test")แทน
vancexu

2
mapType? มันควรจะเป็น MapType บนสาย 4 ไม่ใช่หรือ?
lolololol ถึง

ไม่แน่ใจว่าใครเป็นคนแรก แต่เห็นได้ชัดว่าเป็นสำเนาวางของอีกอัน: cppbuzz.com/What-is-difference-between-map-and-multimap
maximum_prime_is_463035818

1
ahah cppbuzz กำลังขูด StackOverflow หรืออะไรฉันเขียนคำตอบนี้ด้วยตัวเองเมื่อหลายปีก่อนตอนที่ฉันยังเขียนโค้ด c ++ ทุกวัน และมีพิมพ์ผิดบรรทัดที่ 4 แน่นอนขอบคุณ @lololololol
typedef

1
(และการคัดลอก / วางล้มเหลวพวกเขาไม่ได้แสดงประเภทในเทมเพลต std :: map declaration: std :: map <std :: string, int>)
typedef

13
map::insert

เนื่องจากmapคอนเทนเนอร์ไม่อนุญาตให้มีค่าคีย์ที่ซ้ำกันการดำเนินการแทรกจะตรวจสอบสำหรับแต่ละองค์ประกอบที่แทรกว่ามีองค์ประกอบอื่นอยู่แล้วในคอนเทนเนอร์ด้วยค่าคีย์เดียวกันหรือไม่หากเป็นเช่นนั้นองค์ประกอบจะไม่ถูกแทรกและค่าที่แมปจะไม่เปลี่ยนแปลง แต่อย่างใด

ในทางกลับกัน

multimap::insert 

สามารถแทรกรายการจำนวนเท่าใดก็ได้โดยใช้คีย์เดียวกัน

http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/


ลิงก์ที่ดีเกี่ยวกับความแตกต่างและวิธีการทำงานภายใน ลิงค์
Rndp13

10

อย่างหลังต้องการให้สามารถสั่งซื้อค่าได้ (ไม่ว่าจะผ่านoperator<หรือฟังก์ชันการเปรียบเทียบ) แต่ก่อนหน้านี้ไม่ได้


มันจะปรากฏตัวดำเนินการ <ทำงานเหมือนกันบนแผนที่หรือมัลติแมป? en.cppreference.com/w/cpp/container/map/operator_cmp
johnbakers

ใช่ แต่คำตอบของฉันอ้างถึงลำดับของค่า สมมติว่าคุณมีประเภทTที่ไม่มีการสั่งซื้อ คุณสามารถใช้เพื่อสร้างไฟล์std::multimap<U, T>. แต่คุณไม่สามารถใช้สร้างstd::map<U, std::set<T> >ไฟล์.
Björn Pollex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.