gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:44:35 27 4
gpt4 key购买 nike

我编写了一个简单的模板函数,用于基于范围和基于容器的“最频繁值”搜索,但要真正做到“通用”,我想知道如果容器或范围为空。在下面的第一稿中,我使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com