Tôi thấy hành vi của std::string::find
nó không phù hợp với các thùng chứa C ++ tiêu chuẩn.
Ví dụ
std::map<int, int> myMap = {{1, 2}};
auto it = myMap.find(10); // it == myMap.end()
Nhưng đối với một chuỗi,
std::string myStr = "hello";
auto it = myStr.find('!'); // it == std::string::npos
Tại sao không nên myStr.find('!')
trả lại thất bại myStr.end()
thay vì std::string::npos
?
Vì std::string
nó có phần đặc biệt khi so sánh với các container khác, tôi tự hỏi liệu có một số lý do thực sự đằng sau điều này. (Đáng ngạc nhiên, tôi không thể tìm thấy bất cứ ai đặt câu hỏi này ở bất cứ đâu).
std::string
bên trong bao gồm các nhân vật là các yếu tố rẻ tiền (liên quan đến bộ nhớ). Và, hơn nữa, nhân vật là loại duy nhất std::string
có thể chứa. Mặt khác, std::map
bao gồm các yếu tố phức tạp hơn. Ngoài ra, đặc điểm kỹ thuật của việc std::map::find
nói rằng nó được cho là tìm thấy một yếu tố và đặc điểm kỹ thuật std::string::find
nói rằng nhiệm vụ của nó là tìm vị trí.