Tôi có một unordered_map
có sử dụng một chuỗi kiểu như một chìa khóa:std :: unordered_map :: tìm cách sử dụng loại khác với loại Khóa?
std::unordered_map<string, value> map;
Một chuyên std::hash
được cung cấp cho string
, cũng như một phù hợp operator==
.
Bây giờ tôi cũng có một "chuỗi view" class, mà là một con trỏ yếu thành một chuỗi hiện có, tránh phân bổ đống:
class string_view {
string *data;
size_t begin, len;
// ...
};
Bây giờ tôi muốn để có thể kiểm tra xem một chìa khóa tồn tại trên bản đồ bằng cách sử dụng đối tượng string_view
. Thật không may, std::unordered_map::find
có một đối số Key
, không phải là đối số chung T
.
(Chắc chắn, tôi có thể "thúc đẩy" một đến một string
, nhưng điều đó gây ra sự phân bổ Tôi muốn tránh.)
Những gì tôi sẽ đã thích thay vì là một cái gì đó giống như
template<class Key, class Value>
class unordered_map
{
template<class T> iterator find(const T &t);
};
sẽ yêu cầu operator==(T, Key)
và std::hash<T>()
để được xác định phù hợp và sẽ trả về một trình lặp cho một giá trị phù hợp.
Có cách giải quyết nào không?
Bạn có thể thay đổi chương trình của mình để sử dụng lớp 'chuỗi' tùy chỉnh có quản lý phân bổ chuỗi/heap của riêng nó không? – Dai
Trong khi tôi đang nghĩ về câu trả lời, chỉ là một lưu ý nhỏ - lớp 'string_view' của bạn thường được gọi là' string_ref' – SergeyA
tại sao không cung cấp toán tử đúc cho tham chiếu 'std :: string' trong' string_view' của bạn có liên quan đến ' dữ liệu'? 'toán tử std :: string &() {return * data; } 'Sau đó, không có phân bổ. – PaulMcKenzie