我只能使用C++ 98,並且無法訪問使用C++ 11添加的std::map::at()
的實現。C++ 98 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
- 我怎樣才能解決這個問題?
- 我的包裝有任何其他問題嗎?
你應該find'的'結果存儲在一個變量爲了不遍歷地圖兩次。 –
這個問題似乎是脫離主題,因爲它是關於什麼相當於一個錯字。 –
@KubaOber我不同意。這個問題更多的是缺乏理解爲什麼通過值傳遞'map'不會修改元素而不是簡單的錯字。操作準則顯然不明白爲什麼按價值傳遞它不能像預期的那樣工作。 –