C++ 使用字符串视图查找地图

C++ 使用字符串视图查找地图,c++,dictionary,c++14,string-view,C++,Dictionary,C++14,String View,以下代码无法在最新的编译器(g++-5.3、clang++-3.7)上构建 但是find是否应该能够使用类似的类型? Cppreference提到了以下重载: template迭代器查找(constk&x) 同样的错误也发生在boost::string_ref中。您需要明确指定一个(如: 在语义上等同于: key_type key = x; c.find(key); 特别是,在实际调用之前,x和key\u type之间的转换只发生一次 异构查找取代了这种转换,有利于比较键和x。这可能导致现有代

以下代码无法在最新的编译器(g++-5.3、clang++-3.7)上构建

但是
find
是否应该能够使用类似的类型? Cppreference提到了以下重载:

template迭代器查找(constk&x)

同样的错误也发生在
boost::string_ref

中。您需要明确指定一个(如:

在语义上等同于:

key_type key = x;
c.find(key);
特别是,在实际调用之前,
x
key\u type
之间的转换只发生一次

异构查找取代了这种转换,有利于比较
x
。这可能导致现有代码的性能下降(由于每次比较之前的附加转换),甚至中断编译(如果比较运算符是成员函数,则不会对左侧操作数应用转换):

#包括
#包括
结构A
{
int i;
A(int i):i(i){}
};

布尔运算符如何对无序映射执行相同操作?对于无序映射,应使用C++20:
error: no matching member function for call to 'find'
    m.find(sv);
    ~~^~~~
std::map<std::string, int, std::less<>> m;
//                         ~~~~~~~~~~^
c.find(x);
key_type key = x;
c.find(key);
#include <set>
#include <functional>

struct A
{
    int i;

    A(int i) : i(i) {}
};

bool operator<(const A& lhs, const A& rhs)
{
    return lhs.i < rhs.i;
}

int main()
{
    std::set<A, std::less<>> s{{1}, {2}, {3}, {4}};
    s.find(5);
}