(加速C+;+;)管理内存章节 我正在经历加速C++,我被困在练习10.3中,我完全不知道如何开始。我想在这里提到,这不是作业练习,我只是为了获得对C++的信心。问题如下所示
重写§8.1.1/140中的中值函数,以便我们可以调用它 使用向量或内置数组。该函数应允许 任何算术类型的容器 上述问题的代码如下所示(加速C+;+;)管理内存章节 我正在经历加速C++,我被困在练习10.3中,我完全不知道如何开始。我想在这里提到,这不是作业练习,我只是为了获得对C++的信心。问题如下所示,c++,C++,重写§8.1.1/140中的中值函数,以便我们可以调用它 使用向量或内置数组。该函数应允许 任何算术类型的容器 上述问题的代码如下所示 template <class T> T median( vector<T> v) { typedef typename vector<T>::size_type vec_sz; vec_sz size = v.size(); if( size == 0 ) { th
template <class T>
T median( vector<T> v)
{
typedef typename vector<T>::size_type vec_sz;
vec_sz size = v.size();
if( size == 0 )
{
throw domain_error(" median of an empty vector");
}
sort( v.begin(), v.end() );
vec_sz mid = size /2;
return size%2 == 0 ? ( v[mid]+v[mid+1])/2 : v[mid] ;
}
模板
T中位数(向量v)
{
typedef typename vector::size_type vec_sz;
向量大小=v.大小();
如果(大小==0)
{
抛出域_错误(“空向量的中值”);
}
排序(v.begin(),v.end());
vec_sz mid=尺寸/2;
返回大小%2==0?(v[mid]+v[mid+1])/2:v[mid];
}
我不知道下一步该做什么。任何帮助或批评对我都是有益的。
感谢并问候juanchopanza和Mooing Duck的评论以及迭代器提示可能是本书练习的正确方法。但是,在实际应用中,我可以编写一个接受数组的包装函数,并调用接受向量的原始函数:
template <class T, size_t N>
T median (const T (&a)[N])
{
return median(std::vector<T>(a, a+N));
}
模板
T中位数(常数T&a)[N])
{
返回中位数(标准::向量(a,a+N));
}
juanchopanza和Mooing Duck的评论以及迭代器提示可能是本书练习的正确方法。但是,在实际应用中,我可以编写一个接受数组的包装函数,并调用接受向量的原始函数:
template <class T, size_t N>
T median (const T (&a)[N])
{
return median(std::vector<T>(a, a+N));
}
模板
T中位数(常数T&a)[N])
{
返回中位数(标准::向量(a,a+N));
}
提示:标准库传递迭代器以指定要处理的范围。你可以做类似的事情。使用std::begin
和std::end
。如果我没有弄错的话,std::begin是C++11的一部分,我使用的是mac和GCC4.2,它不支持。。所以我想知道我是否可以使用其他方法?是的,你可以。由于数组的元素是连续的,因此可以传递指向第一个元素的指针,并通过最后一个元素的结尾进行一对一的传递。指针满足迭代器的许多要求。例如,见。虽然我建议您实现自己的开始
和结束
功能。谢谢juanchopanza,Mooing duck,我想通过你们提供的提示,我可以解决这个问题。我明天晚上试试看,因为这里已经很晚了。非常感谢您的快速回复。我有点害怕我可能会在这里得到很多负面的观点..提示:标准库传递迭代器来指定要处理的范围。你可以做类似的事情。使用std::begin
和std::end
。如果我没有弄错的话,std::begin是C++11的一部分,我使用的是mac和GCC4.2,它不支持。。所以我想知道我是否可以使用其他方法?是的,你可以。由于数组的元素是连续的,因此可以传递指向第一个元素的指针,并通过最后一个元素的结尾进行一对一的传递。指针满足迭代器的许多要求。例如,见。虽然我建议您实现自己的开始
和结束
功能。谢谢juanchopanza,Mooing duck,我想通过你们提供的提示,我可以解决这个问题。我明天晚上试试看,因为这里已经很晚了。非常感谢您的快速回复。我有点害怕我可能会在这里得到很多负面的观点。不过,这个练习需要一个可以同时用这两种方法调用的函数。@juanchopanza:我不反对这一点。对于函数重载,我的建议提供了一个可以同时被两个函数调用的函数名(而不是单个函数)。不过,这个练习需要一个可以同时被两个函数调用的函数。@juanchopanza:我不反对这一点。对于函数重载,我的建议是提供一个可以由两者调用的函数名(而不是单个函数)。