C++ 声明泛型迭代器

C++ 声明泛型迭代器,c++,templates,iterator,C++,Templates,Iterator,我有以下问题:我需要创建一个函数,它接受两个迭代器和一个值,并检查是否在这两个迭代器之间找到了值。问题:我只能有一个模板参数,它表示迭代器中元素的类型和值 我的尝试是这样的,但似乎不起作用: template <typename T> T myFind(iterator<std::bidirectional_iterator_tag,T> begin, iterator<std::bidirectional_iterator_tag, T> end, T el

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

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

template <typename T>
T myFind(iterator<std::bidirectional_iterator_tag,T> begin, iterator<std::bidirectional_iterator_tag, T> end, T elem){
// Code
}
模板
T myFind(迭代器开始、迭代器结束、T元素){
//代码
}
但这不起作用:

// vector<int> vect; list<string> lst;
myFind(vect.begin(), vect.end(), 15);
myFind(lst.begin(), lst.end(), "some element");
//矢量向量;列表lst;
myFind(vect.begin(),vect.end(),15);
myFind(lst.begin(),lst.end(),“some元素”);
有什么想法吗? 更改后的代码:

 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;
 }
模板
T myFind(T begin,T end,typename std::迭代器特征::值类型元素){
for(T it=begin;it!=end;++it){
如果(*it==elem){
归还它;
}
}
返回端;
}

能否有一个迭代器类型的模板参数?如果是:

template <typename It>
typename std::iterator_traits<It>::value_type
myFind(It begin, It end, typename std::iterator_traits<It>::value_type elem){
  // ...
}
模板
typename std::迭代器特征::值类型
myFind(开始、结束、类型名称std::迭代器特征::值类型元素){
// ...
}
否则,我认为你的限制太强了


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

您可以有一个迭代器类型的模板参数吗?如果是:

template <typename It>
typename std::iterator_traits<It>::value_type
myFind(It begin, It end, typename std::iterator_traits<It>::value_type elem){
  // ...
}
模板
typename std::迭代器特征::值类型
myFind(开始、结束、类型名称std::迭代器特征::值类型元素){
// ...
}
否则,我认为你的限制太强了



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

为什么要使用双向迭代器?这是我最后一次尝试的一部分:)“我只能有一个模板参数”——为什么?这是一个完全愚蠢的限制。@Xeo但不幸的是,这是一个我必须遵守的限制。我知道如何用两个模板参数解决这个问题,但不是一个。我不明白这个问题。您已经编写了一个详细的、受限版本的
std::find
。为什么
std::find
不合适?为什么要使用双向迭代器?这是我最后一次尝试的一部分:)“我只能有一个模板参数”——为什么?这是一个完全愚蠢的限制。@Xeo但不幸的是,这是一个我必须遵守的限制。我知道如何用两个模板参数解决这个问题,但不是一个。我不明白这个问题。您已经编写了一个详细的、受限版本的
std::find
。为什么
std::find
不合适?可能就是这样..我稍后会尝试一下,然后带着反馈回来:)这是我一直在搜索的内容,但它似乎对列表不起作用。我正在尝试“myFind(lst.begin(),lst.end(),“SOME sTRING”)-lst.begin();”但它说“与运算符不匹配-在…@Daniel
myFind
中,在本例中返回一个
std::sTRING
,您正在尝试执行
-lst.begin()
在上面。你想让你的
myFind
返回一个
it
吗?是的。我忘了提到这个。我把返回类型改成了T。现在让我在我的问题中发布修改过的代码。将代码添加到问题中。基本上,我正在尝试查找元素是否在给定的迭代器范围内。如果是,返回第一个出现的。这是c很好。我稍后会尝试一下,然后带着反馈回来:)这是我正在搜索的内容,但它似乎对列表不起作用。我正在尝试“myFind(lst.begin(),lst.end(),“SOME sTRING”)-lst.begin();但是它说“与运算符不匹配-在…@Daniel
myFind
中,在本例中返回一个
std::string
,您正在尝试对其执行
-lst.begin()
。您想让您的
myFind
返回
It
吗?是的。我忘了提那件事了。我将返回类型更改为T。现在让我在问题中发布更改的代码。将代码添加到问题中。基本上,我试图找出一个元素是否在给定的迭代器范围内。如果是,请返回第一次出现的情况。