我目前有两个地图将枚举值链接到字符串,一个方向将文件输入转换为内部表示,另一个方向打印(调试)有关该内部表示的信息。我想将地图更改为矢量,以便更快地访问和转换。但是,这个按预期工作的功能将不起作用:
template<class T, class Y>
const T & map_value( const std::map<Y,T> &map, const Y &key )
{
return (*map.find(key)).second;
}
所以我试着把它变成这个:
template<class Cont, class T, class Y>
const T & map_value( const Cont &map, const Y &key )
{
return map[key];
}
但是我没有得到匹配的函数调用。我刚刚有一个顿悟写这个问题; const map
没有成员operator[]
,这使得这很难做到。我应该如何编写map_value,以便vector
和map
尽可能快地运行?
答案 0 :(得分:2)
这是单行。当然,为两种类型(地图和向量)重载它并不是太多开销。
事实上,这是实现这一目标的唯一方法。我理解拥有尽可能通用的功能的愿望 - 好! - 但是需要来封装相应的访问模式(find
与operator []
)。在您的情况下,该函数不执行任何操作,但访问数据结构。
答案 1 :(得分:2)
保留第一个定义,但更改第二个定义以涵盖所有向量。在程序中使用 both ,编译器将根据需要选择适当的版本。
template<class T, class Y>
const T & map_value( const std::map<Y,T> &map, const Y &key )
{
return (*map.find(key)).second;
}
template<class T>
const T & map_value( const std::vector<T> &map, size_t key )
{
return map[key];
}