【问题标题】:(accelerated C++) chapter managing memory(加速 C++)章节管理内存
【发布时间】:2013-02-20 00:06:37
【问题描述】:

我正在经历加速的 C++,我被困在练习 10.3 中,我什至不知道如何开始。我想在这里提一下,这不是家庭作业,我阅读它只是为了获得对 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 )
     {
         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] ;
 }

我不知道下一步该做什么。任何帮助或批评都会对我有益。 谢谢和问候

【问题讨论】:

  • 提示:标准库传递迭代器来指定要处理的范围。你可以做类似的事情。
  • 使用std::beginstd::end
  • 如果我没记错,std::begin 是 C++11 的一部分,我正在使用带有 gcc 4.2 的 mac 并且它不支持 .. 所以我想知道我是否可以使用其他方法?
  • 是的,你可以。由于数组的元素是连续的,您可以传递一个指向第一个元素的指针,并且一对一地传递到最后一个元素的末尾。指针满足迭代器的许多要求。例如,请参阅here。虽然我建议您实现自己的 beginend 函数。
  • 谢谢juanchopanza,哞鸭,我想有了你们提供的提示,我想我能解决这个问题。明天晚上会试一试,因为这里已经很晚了。非常感谢您的快速回复。我有点害怕我可能会在这里得到很多负面评价..

标签: c++


【解决方案1】:

来自 juanchopanza 和 Mooing Duck 的 cmets 以及迭代器的提示可能是本书练习的正确方法。但是,在实际应用中,我可能会改为编写一个接受数组的包装函数,并调用接受向量的原始函数:

template <class T, size_t N>
T median (const T (&a)[N])
{
    return median(std::vector<T>(a, a+N));
}

【讨论】:

  • 这个练习需要一个可以同时调用的函数。
  • @juanchopanza:我对此没有异议。对于函数重载,我的建议是提供一个可以被两者(不是单个函数)调用的函数名。
猜你喜欢
  • 2022-06-16
  • 2010-09-06
  • 2018-12-17
  • 1970-01-01
  • 2014-10-24
  • 2020-01-27
  • 1970-01-01
相关资源
最近更新 更多