【问题标题】:Calculate the sum between two iterators in STL containers计算 STL 容器中两个迭代器之间的和
【发布时间】:2021-02-14 12:32:38
【问题描述】:

我正在解决 STL 容器中的一个问题:

创建一个 Sum() 函数来计算两个迭代器之间的和。然后该函数使用迭代器类型的模板参数并接受两个迭代器,开始和结束

我正在尝试编写以下代码,但我不明白这个问题,谁能帮助我。

template <typename type , typename start , typename  end>
double sum(type& t, start& s , end& e) 
{
  typename t::const_iterator i;
  double sum = 0;
  for (i = s  ; i != e; ++i)
    {
      sum+=*i;
    }
  return sum;
}


int main()
{
  //for list 
  list<double> l; //creat a double type list
  l.push_back(10); //pushing data into list l
  l.push_front(11);//pushing data into list l
  l.push_back(9);//pushing data into list l
  l.push_front(12);//pushing data into list l
  l.push_back(8);//pushing data into list l
  list<double>::iterator itlist;

   cout<<"Sum of List L is : "<< sum( itlist , l.begin() , l.end())<<endl;
}

我认为我做的不对。我有很多错误。我的错误之一是:

no instance of overloaded function "sum" matches the argument list -- argument types are: (std::_List_iterator<double>, std::_List_iterator<double>, std::_List_iterator<double>)

【问题讨论】:

  • 您还没有告诉我们您遇到了什么问题。请将其添加到问题中。
  • 请问t 是什么?
  • 代码没有编译,因为它给出了很多错误。我不认为我工作正常。
  • 没有重载函数“sum”的实例与参数列表匹配——参数类型为:(std::_List_iterator, std::_List_iterator, std::_List_iterator )
  • t 是一个变量,而不是类型或命名空间。 t::const_iterator 没有意义。

标签: c++ stl iterator


【解决方案1】:

您的代码存在许多问题。在这个函数中:

template <typename type , typename start , typename  end>
double sum(type& t, start& s , end& e) 

您将引用se。但这不能绑定到 l.begin()l.end(),因为它们返回 r 值。

迭代器一般都是通过拷贝来传递的,所以你可以简单地写:

template <typename type , typename start , typename  end>
double sum(type& t, start s , end e) 

你这里也有问题:

typename t::const_iterator i;

您不能这样做,因为t 是一个变量,而不是一个类型。

但是,您根本不需要拼出i 的类型。相反,你可以简单地写:

for (auto i = s  ; i != e; ++i)
{
  // ...
}

并让编译器推断i的类型。


事实上,根本不需要将itlist 传递给您的函数,因为所有需要的信息都在其他参数中。此外,由于两个参数的类型相同,因此您只需要一个模板参数。

所以现在你的函数就是

template <typename iter>    // a single template argument
double sum(iter s , iter e) // 2 function arguments, both of the same type
{
  // ...
}

你会这样称呼它:

sum(l.begin() , l.end())

这是demo

【讨论】:

  • 是的,错误消失了,谢谢你的回答,但你能解释一下 t 的目的是什么吗?我必须在哪里使用迭代器类型?
  • @HamzaAsif t 没有任何目的。我已经编辑了答案来解释这一点。
  • 我觉得你的回答比我的好,很好!
  • 感谢您的回答,我现在可以理解,感谢演示。代码运行良好并给了我正确的输出
  • @HamzaAsif 看来您正在尝试接受多个答案。但是你最多只能选择一个。不过,您可以投票赞成所有您认为有用的答案:)
【解决方案2】:

您可以尝试的一种方法是将 const 引用传递给迭代器的开始和结束。而且,一个 typename 就足够了,其他的可以丢弃。

那么这个typename t::const_iterator i; 没有意义,因为t 是一个变量。要回答你的评论,你也不能typename type::const_iterator i;

最简单的解决方案是丢弃有问题的 const 迭代器行,并在 for 循环中使用 auto 关键字。

把所有东西放在一起,你会得到这个:

template <typename T>
double sum(T const& start, T const& end) 
{
  double sum = 0;
  for(auto i = start; i != end; ++i)
  {
    sum+=*i;
  }
  return sum;
}

这样称呼:

cout << "Sum of List L is: "<< sum(l.begin() , l.end()) << endl;

和输出(Run it Online):

Sum of List L is: 50

替代方案:@cigien 的答案,它通过值而不是引用传递迭代器,这是传递迭代器的典型方法 - 我只是试图尽可能接近 OP 的代码。


回答您的评论:

创建一个 Sum() 函数来计算两个迭代器之间的总和。 然后该函数使用模板参数迭代器类型 并接受两个迭代器,开始和结束。

然后您可以简单地使用类型名称 T 而不是 auto 关键字,如下所示:

template <typename T>
double sum(T const& start,T const& end) 
{
  double sum = 0;
  for(T i = start; i != end; ++i)
  {
    sum+=*i;
  }
  return sum;
}

Run it Online

【讨论】:

  • 如果您看到我的问题:这一行:该函数然后将模板参数用于迭代器类型并接受两个迭代器..我与此有什么关系??我应该忽略这个吗?请帮助并感谢您的回答,我非常了解,非常感谢您
  • 这:行:? @HamzaAsif 请问您是什么意思?不客气。
  • 请在帖子中查看我的问题 => 创建一个 Sum() 函数来计算两个迭代器之间的总和。 然后该函数使用模板参数作为迭代器类型并接受两个迭代器,开始和结束
  • @HamzaAsif 我明白,如果你想完全那样做,那么使用类型名称 T 而不是 auto 关键字,就像我编辑的答案在其末尾解释的那样。希望对您有所帮助,欢迎来到 Stack Overflow! :)
猜你喜欢
  • 2013-04-16
  • 2019-02-23
  • 1970-01-01
  • 2011-01-15
  • 2014-05-03
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多