【问题标题】:Declaring a generic iterator声明一个泛型迭代器
【发布时间】:2012-12-07 12:27:06
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么要使用双向迭代器?
  • 这是我最后一次尝试完成这项工作的一部分 :)
  • “我只能有一个模板参数”——为什么?这是一个完全愚蠢的限制。
  • @Xeo 但不幸的是,这是我必须遵守的限制。我知道如何用两个模板参数解决这个问题..但不是一个。
  • 我不明白这个问题。您已经编写了 std::find 的精巧、受限版本。为什么std::find 不合适?

标签: c++ templates iterator


【解决方案1】:

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

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

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

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

【讨论】:

  • 这可能是它..我会试一试,然后回来反馈:)
  • 这是我正在寻找的,但它似乎不适用于列表。我正在尝试“myFind(lst.begin(), lst.end(), "SOME sSTRING") - lst.begin());”但它说“不匹配 operator-in...
  • @Daniel myFind 在这种情况下返回一个 std::string 并且您正在尝试对其执行 - lst.begin() 。您是否希望您的 myFind 改为返回 It
  • 是的。我忘了提那个。我将返回类型更改为 T。现在让我在我的问题中发布更改后的代码。
  • 将代码添加到问题中。基本上我试图找出一个元素是否在给定的迭代器范围内。如果是,则返回第一次出现。
猜你喜欢
  • 2018-12-09
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多