คำถามติดแท็ก unordered-map

12
มีข้อดีของการใช้แผนที่บน unordered_map ในกรณีที่เป็นกุญแจสำคัญหรือไม่?
การพูดคุยเมื่อไม่นานมานี้unordered_mapใน C ++ ทำให้ฉันรู้ว่าฉันควรใช้unordered_mapกับกรณีส่วนใหญ่ที่ฉันเคยใช้มาmapก่อนเนื่องจากประสิทธิภาพของการค้นหา ( ตัดจำหน่าย O (1)เทียบกับO (log n ) เวลาส่วนใหญ่ที่ฉันใช้แผนที่ฉันใช้อย่างใดอย่างหนึ่งintหรือstd::stringเป็นชนิดคีย์ ดังนั้นฉันไม่มีปัญหากับนิยามของฟังก์ชันแฮช ยิ่งฉันคิดถึงมันมากเท่าไรฉันก็ยิ่งรู้ว่าฉันไม่สามารถหาเหตุผลในการใช้ปุ่มstd::mapa std::unordered_mapในกรณีของปุ่มที่มีประเภทง่าย ๆ ได้ - ฉันดูที่อินเตอร์เฟสและไม่พบสิ่งใดเลย ความแตกต่างที่สำคัญที่จะส่งผลกระทบต่อรหัสของฉัน ดังนั้นคำถาม: มีเหตุผลที่แท้จริงที่จะใช้std::mapมากกว่าstd::unordered_mapในกรณีของประเภทง่ายเช่นintและstd::string? ฉันขอจากมุมมองการเขียนโปรแกรมอย่างเคร่งครัด - ฉันรู้ว่ามันไม่ได้พิจารณาอย่างเต็มที่มาตรฐานและอาจก่อให้เกิดปัญหากับการย้าย นอกจากนี้ฉันคาดหวังว่าหนึ่งในคำตอบที่ถูกต้องอาจเป็น"มันมีประสิทธิภาพมากกว่าสำหรับชุดข้อมูลขนาดเล็ก"เนื่องจากมีค่าใช้จ่ายน้อย (นั่นเป็นเรื่องจริงหรือ?) - ดังนั้นฉันจึงต้องการ จำกัด คำถามให้กับกรณีที่จำนวน คีย์นั้นไม่สำคัญ (> 1 024) แก้ไข: duh ฉันลืมชัดเจน (ขอบคุณ GMan!) - ใช่แผนที่ได้รับคำสั่งแน่นอน - ฉันรู้แล้วและกำลังมองหาเหตุผลอื่น

2
C ++ unordered_map โดยใช้ประเภทคลาสที่กำหนดเองเป็นคีย์
ฉันพยายามที่จะใช้คลาสที่กำหนดเองเป็นกุญแจสำคัญสำหรับการunordered_mapเช่นต่อไปนี้: #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; class node; class Solution; class Node { public: int a; int b; int c; Node(){} Node(vector<int> v) { sort(v.begin(), v.end()); a = v[0]; b = v[1]; c = v[2]; } bool operator==(Node i) { if ( i.a==this->a && i.b==this->b &&i.c==this->c …

3
จะเชี่ยวชาญ std :: hash <Key> :: operator () สำหรับชนิดที่ผู้ใช้กำหนดในคอนเทนเนอร์ที่ไม่ได้เรียงลำดับได้อย่างไร
ในการรองรับประเภทคีย์ที่ผู้ใช้กำหนดstd::unordered_set&lt;Key&gt;และstd::unordered_map&lt;Key, Value&gt; ต้องระบุoperator==(Key, Key)และแฮช functor: struct X { int id; /* ... */ }; bool operator==(X a, X b) { return a.id == b.id; } struct MyHash { size_t operator()(const X&amp; x) const { return std::hash&lt;int&gt;()(x.id); } }; std::unordered_set&lt;X, MyHash&gt; s; จะสะดวกกว่าในการเขียนstd::unordered_set&lt;X&gt; โดยใช้แฮชเริ่มต้นสำหรับประเภทXเช่นประเภทที่มาพร้อมกับคอมไพเลอร์และไลบรารี หลังจากปรึกษา C ++ Standard Draft N3242 §20.8.12 …

2
std :: unordered_map โอเปอเรเตอร์ [] ทำการ zero-initialization สำหรับคีย์ที่ไม่มีอยู่หรือไม่?
ตาม cppreference.com std::map::operator[]สำหรับค่าที่ไม่ได้มีอยู่จะเริ่มต้นเป็นศูนย์ อย่างไรก็ตามไซต์เดียวกันไม่ได้กล่าวถึงการกำหนดค่าเริ่มต้นเป็นศูนย์std::unordered_map::operator[]ยกเว้นจะมีตัวอย่างที่ต้องใช้สิ่งนี้ แน่นอนว่านี่เป็นเพียงเว็บไซต์อ้างอิงไม่ใช่มาตรฐาน ดังนั้นรหัสด้านล่างตกลงหรือไม่? #include &lt;unordered_map&gt; int main() { std::unordered_map&lt;int, int&gt; map; return map[42]; // is this guaranteed to return 0? }

1
หน่วยความจำรั่วในระหว่าง unordered_map :: ใส่ข้อยกเว้น KeyEqual กับ GCC - ทำลายการรับประกันความปลอดภัยข้อยกเว้นที่รัดกุมหรือไม่
ฉันใช้ GCC 7.3.1 แต่ได้ทดสอบกับ coliru ด้วยซึ่งฉันเชื่อว่าเป็นรุ่น 9.2.0 สร้างด้วยสิ่งต่อไปนี้: g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp ที่นี่rai.cpp: #include &lt;iostream&gt; #include &lt;unordered_map&gt; int main() { try { struct MyComp { bool operator()(const std::string&amp;, const std::string&amp;) const { throw std::runtime_error("Nonono"); } }; std::unordered_map&lt;std::string, std::string, std::hash&lt;std::string&gt;, MyComp&gt; mymap; mymap.insert(std::make_pair("Hello", "There")); mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.