如何解决计算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)
您正在引用s
和e
。但这不能绑定到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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。