ฉันพบว่าพฤติกรรมของstd::string::find
ไม่สอดคล้องกับคอนเทนเนอร์ C ++ มาตรฐาน
เช่น
std::map<int, int> myMap = {{1, 2}};
auto it = myMap.find(10); // it == myMap.end()
แต่สำหรับสตริง
std::string myStr = "hello";
auto it = myStr.find('!'); // it == std::string::npos
ทำไมไม่ควรล้มเหลวในmyStr.find('!')
การกลับมาmyStr.end()
แทนstd::string::npos
?
เนื่องจากstd::string
ค่อนข้างจะพิเศษเมื่อเทียบกับตู้คอนเทนเนอร์อื่น ๆ ฉันสงสัยว่ามีเหตุผลจริง ๆ อยู่เบื้องหลังสิ่งนี้หรือไม่ (น่าแปลกที่ฉันไม่พบใครซักคนที่นี่)
std::string
ภายในประกอบด้วยอักขระที่มีองค์ประกอบราคาไม่แพง (ในเรื่องของหน่วยความจำ) และยิ่งไปกว่านั้นตัวละครเป็นประเภทเดียวที่std::string
สามารถมี ในทางกลับกันstd::map
ประกอบด้วยองค์ประกอบที่ซับซ้อนมากขึ้น นอกจากนี้สเปคของstd::map::find
บอกว่ามันควรจะหาองค์ประกอบและสเปคของstd::string::find
บอกว่ามันเป็นงานที่จะหาตำแหน่ง