c – 迭代器和模板

我正在尝试实现一个允许用户输入某种类型的开始和结束迭代器的函数,然后所有函数都对数据执行一些操作.但是,该函数必须足够通用,它应该适用于许多类型的迭代器(例如std :: vector :: iterator,std :: string :: iterator,std :: iterator等).唯一的限制是迭代器必须至少具有forward_iterator_tag功能.

我的函数原型看起来像这样:

template <class key_type,class data_type> std::shared_ptr<data_type> 
    remove(std::iterator<std::forward_iterator_tag,key_type> key_start,std::iterator<std::forward_iterator_tag,key_type> key_end);

但是,这限制了我特别使用forward_iterator_tag迭代器,因此尝试调用这样的函数

remove<char,char>(std::iterator<std::random_access_iterator_tag,char>(),std::iterator<std::random_access_iterator_tag,char());

将失败,因为编译器无法转换std :: iterator< std :: random_access_iterator_tag,...>到std :: iterator< std :: forward_access_iterator_tag,...>.此外,此方法不适用于字符串迭代器,矢量迭代器或其他stl迭代器.

有人知道stl如何实现容器/字符串以接受彼此的迭代器吗?例如,这正确编译:

std::string a = "hello";
std::vector<char> v(a.begin(),a.end());

解决方法

template < typename Iter >
void fun_impl(Iter begin,Iter end,std::forward_iterator_tag)
{
  // do your stuff here...
}

template < typename Iter >
void fun(Iter begin,Iter end)
{
  fun_impl(begin,end,std::iterator_traits<Iter>::iterator_category());
}

begin()和end()为各种容器返回的类型不是迭代器类型< category ...>但是这种(有时)的子类.在编写通用代码时,您永远不会以特定的迭代器类型为目标.相反,您使用“标记调度”来对迭代器进行分类调用正确的实现.由于random_iterator_tag是一个forward_iterator_tag,它将自动转换为这样,以便上面的fun_impl可以正确解析任何forward_iterator或扩展.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...