| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1889 人关注过本帖
标题:C++模板问题
只看楼主 加入收藏
hkhk366
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-4
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
C++模板问题
template <typename Container, typename Function>//这一行创建两个模板我看得懂
typename Container::value_type//这一行是什么意思?看不明白
Reduce(const Container& c, Function fn) throw (NotEnoughElements)//这一行这个Reduce函数是哪里的,STL的?
{
}

代码就这么多,求人帮助,谢谢
2016-02-03 13:25
hkhk366
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-4
收藏
得分:0 
题目是其实就是把代码补全:
Your task is to implement the Reduce function using templates. The Reduce fn
applies a function of two arguments cumulatively to the items of an STL
container, from begin() to end(), so as to reduce the sequence to a single value.
For example, Reduce(<list containing 1,2,3,4,5>, std::plus<int>()) should
calculate ((((1+2)+3)+4)+5).

class NotEnoughElements {};
template <typename Container, typename Function>
typename Container::value_type
Reduce(const Container& c, Function fn) throw (NotEnoughElements)
{
    FILL OUT
}
2016-02-03 13:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
从你一开始的三句话来看,你是一点儿都没看书或听课吧,估计说得再简单你也听不懂

想直接将代码给你,可是这题目又有一些恶心的问题,导致我写不出来
第一个问题,NotEnoughElements 在什么情况下用,是1个元素时,还是0个元素时?无论是0个元素还是1个元素,抛出异常都是有病
第二个问题,对于std::plus<int>之类无所谓,但std::minus<int>呢,比如{1,2,3}是1-2-3还是0-1-2-3?按题目要求来看是第一个,但不会编程的人也能看出第一个行为太搞笑了。
第三,用Container,是智商有问题。

根据题目的要求,其实和 std::accumulate 很像。
template<class InputIterator, class Type, class BinaryOperation>
Type accumulate( InputIterator _First, InputIterator _Last, Type _Val, BinaryOperation _Binary_op );
看红色参数
2016-02-03 14:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
程序代码:
class NotEnoughElements {};

template <typename Container, typename Function>
typename Container::value_type Reduce(const Container& c, Function fn) throw (NotEnoughElements)
{
    typename Container::const_iterator itor = c.begin();
    if( itor == c.end() )
        throw NotEnoughElements();

    typename Container::value_type result = *itor;
    for( ++itor; itor!=c.end(); ++itor )
        result = fn( result, *itor );
    return result;
}

#include <iostream>
#include <algorithm>
#include <list>

int main( void )
{
    std::list<int> con = { 1,2,3,4,5 };
    /* 如果用的编译器太古老,改为
    std::list<int> con;
    con.push_back( 1 );
    con.push_back( 2 );
    con.push_back( 3 );
    con.push_back( 4 );
    con.push_back( 5 );
    // */

    std::cout << Reduce( con, std::plus<int>() ) << std::endl;
    return 0;
}
2016-02-03 14:11
hkhk366
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-4
收藏
得分:0 
回复 4楼 rjsp
首先感谢你的回复,但是你说话也太难听了吧,什么叫再简单也看不懂,人各有所长,我又不是专注搞这些模板类的,没有必要看不起别人吧,别人问了一个你擅长别人不擅长的问题,身为一个版主你这么说是不是太过了,我也有我擅长的,我会的你未必都会。

你这个答案和这个一模一样http://www.

答案我是有的,我就是想知道那两句话的写法是什么意思

根据我的理解下面这句话的意思是
typename Container::value_type Reduce(const Container& c, Function fn) throw (NotEnoughElements)

typename Container::value_type是取出来Container的里面的类型作为函数Reduce的返回值
const Container& c, Function fn是函数Reduce两个参数
throw (NotEnoughElements)在函数声明部分写不写都能正常运行,只要在函数体里面对应位置有就行了
而typename Container::const_iterator itor则是生成一个Container的对应iterator
而std::plus<int>()相当于加法器处理函数,每次让两个数相加

这次的理解对了吧,谢谢

[此贴子已经被作者于2016-2-4 01:50编辑过]

2016-02-03 23:24
快速回复:C++模板问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016708 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved