c++ - 使用 C++98 标准访问 map

标签 c++ c++11 c++98

我有以下 C++11 兼容代码,我需要用不支持 '.at' 的 C++98 编译它。如何重写它以兼容 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;
}

最佳答案

只需创建一个 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;
}

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

关于c++ - 使用 C++98 标准访问 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845500/

相关文章:

c++ - 包含所需代码时出现 Visual C++ 单元测试错误

c++ - 使用 new 分配连续空间还是使用 vector ?

haskell - C++11 相当于 Haskell 的 "inits"

visual-c++ - C++0x 分配器

c++ - 获取 HDF5 ArrayType 中的数据类型

c++ - QNetworkAccessManager 在获取时崩溃

c++ - 用函数替换宏

c++ - CreateProcess 不遵守命令行

c++ - 为什么需要 C++ 头文件的包含保护?

c++ - std::tr1::function - 在公共(public)容器中存储各种类型的函数对象