Lý do họ thực hiện khó khăn này là vì nó nguy hiểm. Bạn phải BẢO ĐẢM rằng không ai trong số std::string
thành viên bị khóa sẽ không bao giờ thay đổi giá trị hoặc toàn bộ bản đồ bị vô hiệu. Thú vị, giải pháp đầu tiên xuất hiện trong đầu xuất hiện một cách điên rồ, và trông như UB, nhưng tôi tin rằng tôi rất cẩn thận với UB.
struct key_type {
mutable const char* ptr;
};
bool operator<(const key_type& lhs, const key_type& rhs)
{return strcmp(lhs.ptr, rhs.ptr)<0;}
struct person {
std::string name;
int age;
};
person& people_map_get(std::map<key_type, person>& map, const char* name) {
auto it = map.insert(name, person{name}).first; //grab, possibly insert
if->first.ptr = it->second.name.c_str(); //in case of insert, fix ptr
return it->second;
}
person& people_map_assign(std::map<key_type, person>& map, person p) {
auto pair = map.insert(name, p); //grab, possibly insert
auto it = pair.first;
if (pair.second == false)
it->second = std::move(p);
if->first.ptr = it->second.name.c_str(); //ptr probably invalidated, so update it
return it->second;
}
int main() {
std::map<key_type, person> people;
people_map_assign(people, person{"ted"});
person frank = people_map_get(people, "frank");
}
Như tôi hy vọng là rõ ràng, đây là điên gần UB, và rất nhiều không được khuyến khích. Về cơ bản, trong khi chèn/tìm, các điểm chính tại đối tượng tạm thời hoặc chuỗi đầu vào của bạn, và sau đó ngay khi đối tượng được chèn/tìm thấy, khóa được thay đổi để trỏ vào giá trị chứa trong thành viên chuỗi và miễn là bạn không bao giờ làm bất cứ điều gì làm mất giá trị trả lại của .c_str()
trên bất kỳ đối tượng nào có chứa person
, mọi thứ chỉ hoạt động gần như không hiệu quả. Tôi nghĩ.
Nguồn
2013-08-28 20:12:51
Cách sử dụng 'std :: set' trong đó 'C' so sánh chuỗi được lưu trữ trong' T'? –
@Daniel: Nhưng sau đó tôi cần phải cung cấp toàn bộ 'T' đối tượng để tra cứu, và không chỉ là một' std :: string', phải không? Hoặc có thể 'C' bị quá tải để so sánh' T' với 'T' và cũng' T' thành 'std :: string'? –
Ahh, tôi thấy rằng C++ 14 sẽ thêm một thành viên 'find' được tìm kiếm để tìm kiếm trên bất kỳ loại nào có thể so sánh với' T'. –