【问题标题】:Does `std::map::at()` not support std::string_view?`std::map::at()` 不支持 std::string_view 吗?
【发布时间】:2020-07-26 12:03:49
【问题描述】:

我在代码中大量使用异常,所以我更喜欢使用at()而不是find()来查找元素,但我刚刚发现at()似乎不支持std::string_view,例如:

#include <map>
#include <iostream>
std::map<std::string, int, std::less<>> map{
    {"one", 1},
    {"two", 2},
};

const char* c = "onetwothree";

int main() {
  std::string_view s(&c[3], 3);
  std::cout << map.find(s)->second << std::endl;
  std::cout << map.at(s) << std::endl; // will not compile
}

那么我可以将at()std::string_view 一起使用吗?或者换句话说,at() 可以支持异构查找吗?

【问题讨论】:

  • @Someprogrammerdude 我认为透明比较器(即less&lt;&gt;)是required 用于异构查找? (至少,对find 的调用不会编译。)

标签: c++


【解决方案1】:

从 C++14 标准开始,find 函数具有模板化重载,支持值等效到键。

at 函数没有这样的重载。传递给at 的值必须与键的类型相同(或隐式转换为键的类型)。

【讨论】:

  • 我认为at 没有充分的理由不支持这一点。当找不到值时,它不必向映射中插入任何内容(因此不必尝试将随机对象类型转换为键类型),因此可以进行透明查找。但是,operator[] 在这方面是行不通的。我认为at 不支持它只是因为它应该在很多方面与operator[] 配对。
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 2016-03-05
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多