มันขาดเพราะไม่มีใครเพิ่ม ไม่มีใครเพิ่มเนื่องจากคอนเทนเนอร์จาก STL ที่std
ไลบรารีรวมไว้ซึ่งออกแบบมาให้มีส่วนต่อประสานน้อยที่สุด (สังเกตว่าstd::string
ว่าไม่ได้มาจาก STL ในลักษณะเดียวกัน)
หากคุณไม่สนใจไวยากรณ์แปลก ๆ คุณสามารถปลอมได้:
template<class K>
struct contains_t {
K&& k;
template<class C>
friend bool operator->*( C&& c, contains_t&& ) {
auto range = std::forward<C>(c).equal_range(std::forward<K>(k));
return range.first != range.second;
// faster than:
// return std::forward<C>(c).count( std::forward<K>(k) ) != 0;
// for multi-meows with lots of duplicates
}
};
template<class K>
containts_t<K> contains( K&& k ) {
return {std::forward<K>(k)};
}
ใช้:
if (some_set->*contains(some_element)) {
}
โดยทั่วไปคุณสามารถเขียนวิธีการขยายสำหรับ C ++ ส่วนใหญ่ได้ std
ประเภทโดยใช้เทคนิคนี้
มันสมเหตุสมผลกว่าที่จะทำสิ่งนี้:
if (some_set.count(some_element)) {
}
แต่ฉันรู้สึกสนุกกับวิธีการขยาย
สิ่งที่น่าเศร้าจริงๆคือการเขียนประสิทธิภาพcontains
อาจเร็วขึ้นบน a multimap
หรือmultiset
เพียงแค่ต้องหาองค์ประกอบเดียวในขณะcount
ที่ต้องหาแต่ละองค์ประกอบและนับและนับพวกเขา
ชุดหลายชุดที่มี 1 พันล้านชุดของ 7 (คุณรู้ไหมว่าในกรณีที่คุณหมด) อาจมีช้า.count(7)
มาก แต่อาจมีเร็วมากcontains(7)
แต่อาจมีความรวดเร็ว
ด้วยวิธีการขยายข้างต้นเราสามารถทำให้เร็วขึ้นสำหรับกรณีนี้โดยใช้lower_bound
เปรียบเทียบกับend
แล้วเปรียบเทียบกับองค์ประกอบ อย่างไรก็ตามการทำเช่นนั้นสำหรับแมวที่ไม่มีการเรียงลำดับเช่นเดียวกับแมวที่ได้รับคำสั่งจะต้องใช้ SFINAE แบบแฟนซีหรือการโอเวอร์โหลดเฉพาะคอนเทนเนอร์