使用C++ 98标准访问地图

Sha*_*Muh 2 c++ c++11 c++98

我有以下C++ 11兼容代码,我需要用C++ 98编译它,它不支持'.at'.如何重写它以与C++ 98兼容?

String suffix("sss");
headers_t& meta = ...;
typedef std::map<std::string, std::string> headerpair_t;
typedef std::map<std::string, headerpair_t> addheader_t;

addheader_t addheader;

for(headerpair_t::const_iterator piter = addheader.at(suffix).begin(); piter !=  addheader.at(suffix).end(); ++piter){
    // Adding header
    meta[(*piter).first] = (*piter).second;
}
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 7

只需创建一个at()模仿C++ 11 std::map<...>::at()所做的功能:

template <typename K, typename V, typename C, typename A>
V const& at(std::map<K, V, C, A> const& m, K const& k) {
    typename std::map<K, V, C, A>::const_iterator it(m.find(k));
    if (it == m.end()) {
        throw std::out_of_range("key not found in map");
    }
    return it->second;
}
Run Code Online (Sandbox Code Playgroud)

请注意,at()在循环的每次迭代中调用都是一个坏主意!搜索a 在理论意义上std::map<...>有效的,但这并不意味着它在实践中很快!您是更好搜索相关节点只有一个,然后继续使用它.