LB-*_*B-- 9 c++ iterator stl template-specialization c++11
所述<algorithm>头部提供std::equal_range(),以及具有作为它的成员函数的一些容器.让这个函数困扰我的是它返回一对迭代器,使得从开始迭代器迭代到结束迭代器变得繁琐.我希望能够使用std::begin(),std::end()以便我可以使用基于C++ 11范围的for循环.
现在,我听到关于矛盾的信息,以专业std::begin()和std::end()-我已经被告知,添加什么不确定的行为std命名空间的结果,而我也被告知,你可以提供自己的专长std::begin()和std::end().
这就是我现在正在做的事情:
namespace std
{
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter begin(pair<Iter, Iter> const &p)
{
return p.first;
}
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter end(pair<Iter, Iter> const &p)
{
return p.second;
}
}
Run Code Online (Sandbox Code Playgroud)
这确实有效:http://ideone.com/wHVfkh
但我想知道,这样做的缺点是什么?有一个更好的方法吗?
17.6.4.2.1/1如果C++程序向命名空间
std或命名空间中的命名空间添加声明或定义,则它是未定义的,std除非另有说明.std只有当声明取决于用户定义的类型并且特化符合原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板特化添加到命名空间 .
所以是的,我相信,从技术上讲,你的代码表现出不确定的行为.也许你可以编写一个简单的类,它在构造函数和实现begin()和end()方法中使用一对迭代器.那你就可以写点东西了
for (const auto& elem: as_range(equal_range(...))) {}
Run Code Online (Sandbox Code Playgroud)