我只能使用C ++ 98,并且无法访问随C ++ 11添加的std::map::at()
的实现。
我的目标是编写一个非成员函数at()
函数(使用C ++ 98),其行为类似于std::map::at()
。
因此我编写了以下非成员函数:
template<typename K, typename V>
V& at(std::map<K, V> map, K key)
{
if (map.find(key) == map.end())
throw std::out_of_range("key not found");
return map.find(key)->second;
}
我至少可以看到一个问题,就是我的版本表现得好像我已经返回了一个副本(见下文)。
std::map<int,int> myMap;
myMap.insert(std::pair<int,int>(2,43));
// myMap.at(2)=44; // modifies the reference
// assert(44==myMap.at(2)); // fine
at(myMap,2)=44; // does not modify the value inside the map, why?
assert(44==myMap.at(2)); // not fine
答案 0 :(得分:10)
主要问题是你正在调用未定义的行为。
您的at
按值获取地图:
V& at(std::map<K, V> map, K key)
因此,您将返回对本地对象中项目的引用,这是非常未定义的。
您应该使用参考:
V& at(std::map<K, V>& map, const K& key)
您可能还想添加const版本:
const V& at(const std::map<K, V>& map, const K& key)
答案 1 :(得分:2)
将签名更改为
V& at(std::map<K, V>& map, K key)
答案 2 :(得分:1)
您的方法中有2个问题:
所以你的代码可能是:
template<typename K, typename V>
V& at(std::map<K, V> &map, K key)
{
std::map<K,V>::iterator f = map.find(key);
if ( f == map.end())
throw std::out_of_range("key not found");
return f->second;
}