c++ - 声明一个通用迭代器

标签 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;
 }

最佳答案

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

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 )。

关于c++ - 声明一个通用迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13763088/

相关文章:

类中的 C++ 迭代器

c++ - 好友声明不转发声明

c++ - CArray 的 ARG_TYPE 是否应该是 const & 或者不是

c++ - 为什么将字符分配给 C++ 字符串会导致字符串长度为 0?

c++ - 为什么 Visual Studio 不允许我在 enable_if 中使用模板化的 constexpr 函数?

c++ - 转发声明 boost::signals2::signal<void()>

python - "enumerate"如何知道何时解包返回值?

java - 如何在 listIterator() 实现中使用父类(super class) iterator() ?

Windows 2008 服务器上的 C++ fputs 断言

c++ - 如何在 visual studio 2010 中重用已链接到 DLL 的静态库代码与另一个 C++ 应用程序?