微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算STL容器中两个迭代器之间的总和

如何解决计算STL容器中两个迭代器之间的总和

我正在处理STL容器中的问题:

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

我正在尝试编写以下代码,但我不理解这个问题,任何人都可以帮助我。

COL1 COL2 COL3  COL4
NaN  A    3     A
B    NaN  78    B
C    C    668   C
D    D    56D   D
G    NaN  56    G
E    E    788   E
H    H    778   H

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

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

解决方法

您的代码存在许多问题。在此功能中:

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

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

迭代器通常还是通过复制传递,因此您可以简单地编写:

template <typename type,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

,

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

然后,这个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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。