ฉันพบว่ามีคีย์เดียวและหลายค่าซึ่งไม่ซ้ำกัน
ฉันพบว่ามีคีย์เดียวและหลายค่าซึ่งไม่ซ้ำกัน
คำตอบ:
มัลติแมปเก็บคู่ของ (คีย์ค่า) ซึ่งทั้งคีย์และค่าสามารถปรากฏได้หลายครั้ง
map<key, set<value>>
จะเก็บค่าแต่ละครั้งสำหรับคีย์ที่เฉพาะเจาะจง ในการทำเช่นนั้นจะต้องสามารถเปรียบเทียบค่าได้ไม่ใช่แค่คีย์เท่านั้น
ขึ้นอยู่กับแอปพลิเคชันของคุณว่าค่าที่เปรียบเทียบเท่ากันมีค่าเท่ากันหรือหากคุณต้องการจัดเก็บแยกต่างหาก บางทีอาจมีช่องที่แตกต่างกัน แต่ไม่ได้มีส่วนในการเปรียบเทียบชุด
std::multimap<key, value>
อนุญาตให้คีย์เดียวกันปรากฏให้เห็นหลายครั้งในขณะที่ต้องมีเอกลักษณ์ของstd::map<key, whatever>
key
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
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")
แทน
map::insert
เนื่องจากmap
คอนเทนเนอร์ไม่อนุญาตให้มีค่าคีย์ที่ซ้ำกันการดำเนินการแทรกจะตรวจสอบสำหรับแต่ละองค์ประกอบที่แทรกว่ามีองค์ประกอบอื่นอยู่แล้วในคอนเทนเนอร์ด้วยค่าคีย์เดียวกันหรือไม่หากเป็นเช่นนั้นองค์ประกอบจะไม่ถูกแทรกและค่าที่แมปจะไม่เปลี่ยนแปลง แต่อย่างใด
ในทางกลับกัน
multimap::insert
สามารถแทรกรายการจำนวนเท่าใดก็ได้โดยใช้คีย์เดียวกัน
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
อย่างหลังต้องการให้สามารถสั่งซื้อค่าได้ (ไม่ว่าจะผ่านoperator<
หรือฟังก์ชันการเปรียบเทียบ) แต่ก่อนหน้านี้ไม่ได้
T
ที่ไม่มีการสั่งซื้อ คุณสามารถใช้เพื่อสร้างไฟล์std::multimap<U, T>
. แต่คุณไม่สามารถใช้สร้างstd::map<U, std::set<T> >
ไฟล์.