ฉันพบว่าพฤติกรรมของ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บอกว่ามันเป็นงานที่จะหาตำแหน่ง