声明一个通用迭代器

时间:2012-12-07 12:27:06

标签: c++ templates iterator

我有以下问题:我需要创建一个函数,它接受两个迭代器和一个值,并检查是否在两者之间找到了值。问题:我只能有一个模板参数,它表示迭代器中元素的类型和值。

我的尝试是这样的,但似乎不起作用:

template <typename T>
T myFind(iterator<std::bidirectional_iterator_tag,T> begin, iterator<std::bidirectional_iterator_tag, T> end, T elem){
// Code
}

但是这不起作用:

// vector<int> vect; list<string> lst;
myFind(vect.begin(), vect.end(), 15);
myFind(lst.begin(), lst.end(), "some element");

有什么想法吗? 更改后的代码:

 template <typename T> 
 T myFind(T begin, T end,typename std::iterator_traits<T>::value_type elem){
   for(T it = begin; it != end; ++it){
     if(*it == elem){
       return it;
     }
    }
    return end;
 }

1 个答案:

答案 0 :(得分:1)

你有一个模板参数是迭代器类型吗?如果是这样的话:

template <typename It>
typename std::iterator_traits<It>::value_type
myFind(It begin, It end, typename std::iterator_traits<It>::value_type elem){
  // ...
}

否则,我认为你的限制太强了。

编辑之后:如果要对返回的迭代器执行-(正如您在注释中所示),则需要一个随机访问迭代器。但是,std::list::iterator是一个双向迭代器,所以你不能。您需要使用std::prev(或在C ++ 03中,使用std::advance)。