我有以下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;
}
答案 0 :(得分:7)
只需创建一个模仿C ++ 11 at()
所做的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<...>
效率但这并不意味着它在实践中很快! 你最好只搜索一个相关节点,然后继续使用它。
答案 1 :(得分:2)
您不应该在at()
循环条件中使用for
。该元素在迭代之间不会发生变化,并且每次检索都会产生开销。所以你应该使用find
检索它,然后在迭代器上循环:
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));
}
}