c++ - 在为 "NaN"编写模板算法时,我们可以将什么作为 "most frequent value"返回?

标签 c++ algorithm templates stl

我编写了一个简单的模板函数,用于基于范围和基于容器的“最频繁值”搜索,但要真正做到“通用”,我想知道如果容器或范围为空。在下面的第一稿中,我使用 numeric_limits 返回 quiet_NaNsignaling_NaN,但是如果 std::iterator_traits::value_typestring ... 默认 CTOR 是个好主意还是好做法?

struct comp_by_second
{
  template <typename Pair>
  bool operator()(const Pair& a, const Pair& b)
  {
    return a.second < b.second;
  }
};

template <typename Fwd>
typename std::iterator_traits<Fwd>::value_type  most_frequent_element(Fwd begin, Fwd end)
{
std::map<typename std::iterator_traits<Fwd>::value_type, int> count;
for (Fwd it = begin; it != end; ++it)
  ++count[*it];

if(count.size() == 0) {
  if(std::numeric_limits<typename std::iterator_traits<Fwd>::value_type >::has_quiet_NaN)
    return std::numeric_limits<typename std::iterator_traits<Fwd>::value_type>::quiet_NaN();
  else {
    if(std::numeric_limits<typename std::iterator_traits<Fwd>::value_type >::has_signaling_NaN)
      return std::numeric_limits<typename std::iterator_traits<Fwd>::value_type>::signaling_NaN();
    else {
      return std::iterator_traits<Fwd>::value_type () /*default CTOR similar to uninitialized ... ??? */;
    }
  }
}
else 
  return (*std::max_element(count.begin(), count.end(), comp_by_second())).first;
}

template <typename C>
typename std::iterator_traits<typename C::iterator>::value_type  most_frequent_element(const C& container)
{
 return most_frequent_element(container.begin(), container.end());
}

最佳答案

如果您允许的输入范围没有涵盖您的数据类型的所有可能值(例如,如果您的数据类型是浮点型并且您知道不允许使用 NaN),那么您可以选择这样的一个“不允许的”值并在容器为空的情况下返回它。

但是,如果没有这样一个不允许的值,就像一个真正通用的模板函数的情况一样,这个策略是不可能的。请注意,即使您返回的 NaN 也不完全正确,因为您实际上可以有一个装满 NaN 的容器,为什么不呢?..在这种情况下,您应该使用一些特殊的方式返回“无值”。这实际上正是boost::optional是为了。特别是,请参阅其 Motivation用于讨论不同的方法。

关于c++ - 在为 "NaN"编写模板算法时,我们可以将什么作为 "most frequent value"返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719870/

相关文章:

c++ - 如何将最高值的 1 位设置为 0 ,最好在 C++ 中

javascript - Meteor:在模板内渲染模板

c++ - 退出进程时等待线程完成

c# - 只寻找现有变量

c++ - 如何在不将参数传递给其构造函数的情况下声明类的对象?

c++ - 包含 boost/optional.hpp 时出现 C2143 语法错误

c++ - 帮忙解决这个问题吗?

algorithm - 如何确定模式中索引处的项目

c++ - 如何将函数包装器转换为模板?

python - 模板与编码的 HTML