首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C++98标准访问地图

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

Stack Overflow用户
提问于 2013-12-30 18:44:57
回答 2查看 2.5K关注 0票数 2

我有下面的C++11兼容代码,我需要用不支持‘.’t‘的C++98编译它。如何重写它以与C++98兼容?

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-30 18:47:17

只需创建一个at()函数,它模仿C++11 std::map<...>::at()所做的工作:

代码语言:javascript
复制
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<...>是有效的,但这并不意味着它在实践中是快速的!您是,最好只搜索一个相关节点,然后继续使用它。

票数 7
EN

Stack Overflow用户

发布于 2013-12-30 19:10:35

您不应该在这样的at()循环条件下使用for。元素在迭代之间不发生变化,并且在每一次循环中都有检索它的开销。因此,您应该使用find检索它,然后在迭代器上循环:

代码语言:javascript
复制
addheader_t::const_iterator header_iter = addheader.find(suffix); // Retrieve the element

if (header_iter != addheader.end()) // Check that it does exist
{
  // Retrieve the sub-map in the pair
  const headerpair_t& header_pair_map = it->second;

  // Loop on the elements
  for (headerpair_t::const_iterator it = header_pair_map.begin(); header_pair_map.end(); ++it)
  {
    // Use insert to avoid a useless element construction
    // Use also `std::make_pair`, but can we directly insert the pair from headerpair ?
    meta.insert(std::make_pair(it->first, it->second));
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20845500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档