c++ std::map<std::string, int> 与std::string_view一起使用

Dmi*_*try 5 c++

假设我有一个std::map<std::string, int>. 有什么方法可以使用它的at方法std::string_view吗?这是一个代码片段:

std::string_view key{ "a" };
std::map<std::string, int> tmp;
tmp["a"] = 0;
auto result = tmp.at(key);
Run Code Online (Sandbox Code Playgroud)

这是我从 clang 12.0 获得的输出

错误:没有匹配的成员函数来调用“at”

自动结果 = tmp.at(key);

Sam*_*hik 6

发生这样的事情需要三件事:

  1. 地图的比较器必须是透明比较器(需要 C++14,但您已经在使用string_viewC++17,所以这是一个有争议的问题)。

  2. at()当容器具有透明比较器时,该方法必须具有参与重载决议的重载。

  3. 该参数必须可转换为地图的key_type.

在您的示例中,这些都不是真的。默认std::less比较器不是透明比较器,对于 没有这样的重载at(),并且std::string没有从 的隐式转换std::string_view

你无能为力at(),但是你可以对比较器做一些事情,即使用 (transparent std::voidcomparer),然后使用find()代替at(),它确实有一个合适的重载:

#include <map>
#include <string>
#include <string_view>


int main()
{
    std::string_view key{ "a" };
    std::map<std::string, int, std::less<void>> tmp;
    tmp["a"] = 0;

    auto iter=tmp.find(key);
}
Run Code Online (Sandbox Code Playgroud)

更完整的演示