我有
std::unordered_map<std::wstring, std::vector<unsigned>> map;
Run Code Online (Sandbox Code Playgroud)
当我尝试
map.find("asdf"sv)
Run Code Online (Sandbox Code Playgroud)
我明白了
error C2664: 'std::_List_const_iterator<std::_List_val<std::_List_simple_types<_Ty>>> std::_Hash<std::_Umap_traits<_Kty,std::vector<unsigned int,std::allocator<unsigned int>>,std::_Uhash_compare<_Kty,_Hasher,_Keyeq>,_Alloc,false>>::find(const std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &) const': cannot convert argument 1 from 'std::wstring_view' to 'const std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &'
Run Code Online (Sandbox Code Playgroud)
有没有可能使用std :: wstring_view编译map.find()或至少在不构造std :: wstring的情况下进行搜索?
您要做的事情称为"异构查找"(基本上,地图的类型和您尝试用于查找的类型是不同的类型).在C++ 20中,由于P0919,我们将获得新的重载,unordered_map::find()这将允许你尝试做的工作.
在此之前,唯一相关的重载特别是a Key const&.而basic_string的从构造函数basic_string_view是explicit (见#10).所以在C++ 17中,你必须写:
map.find("asdf"s)
Run Code Online (Sandbox Code Playgroud)
要么
map.find(std::string("asdf"sv));
Run Code Online (Sandbox Code Playgroud)