首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种适用于各种类型任意嵌套Iterable实现的arithmetic_mean函数

一种适用于各种类型任意嵌套Iterable实现的arithmetic_mean函数
EN

Code Review用户
提问于 2020-11-26 23:17:37
回答 1查看 98关注 0票数 2

这是递推_C++中各种类型任意嵌套Iterable实现的计数函数Boost.MultiArray在C++中的求和函数的后续问题.我正在尝试实现一个arithmetic_mean模板函数,用于计算各种类型的任意嵌套可迭代事物的算术平均值。这里使用了recursive_reduce函数(多亏了格·斯利平的答复)和recursive_size函数。因为这里的recursive_reduce函数和recursive_size函数都需要arithmetic_mean函数,所以有两个新的概念is_recursive_reduceableis_recursive_sizeable创建如下。

代码语言:javascript
复制
template<typename T>
concept is_recursive_reduceable = requires(T x)
{
    recursive_reduce(x, 0.0);
};

template<typename T>
concept is_recursive_sizeable = requires(T x)
{
    recursive_size(x);
};

接下来,arithmetic_mean模板函数的主要部分:

代码语言:javascript
复制
template<class T> requires (is_recursive_reduceable<T> && is_recursive_sizeable<T>)
auto arithmetic_mean(const T& input)
{
    return (recursive_reduce(input, 0.0)) / (recursive_size(input));
}

这个arithmetic_mean模板函数的一些测试用例。

代码语言:javascript
复制
//  std::vector<int> case
std::vector<int> test_vector = {
    1, 2, 3
};
auto arithmetic_mean_result1 = arithmetic_mean(test_vector);
std::cout << arithmetic_mean_result1 << std::endl;

//  std::vector<std::vector<int>> case
std::vector<decltype(test_vector)> test_vector2 = {
    test_vector, test_vector, test_vector
};
auto arithmetic_mean_result2 = arithmetic_mean(test_vector2);
std::cout << arithmetic_mean_result2 << std::endl;

// std::deque<int> case
std::deque<int> test_deque;
test_deque.push_back(1);
test_deque.push_back(1);
test_deque.push_back(1);
auto arithmetic_mean_result3 = arithmetic_mean(test_deque);
std::cout << arithmetic_mean_result3 << std::endl;

// std::deque<std::deque<int>> case
std::deque<decltype(test_deque)> test_deque2;
test_deque2.push_back(test_deque);
test_deque2.push_back(test_deque);
test_deque2.push_back(test_deque);
auto arithmetic_mean_result4 = arithmetic_mean(test_deque2);
std::cout << arithmetic_mean_result4 << std::endl;

上帝的链接在这里。

欢迎所有建议。

摘要资料:

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-11-27 13:35:40

与其简单地打印输出,不如进行自我检查单元测试,这样您就可以在发生故障时立即失败构建,而不必注意到输出中的更改。

您可能希望包含一些具有非常大的(正和负)值的测试,以确保使用这些测试得到准确的结果,并且不会与整数溢出(这将导致对无符号类型的严重不准确,以及对带符号整数类型的未定义行为)发生冲突。

令人失望的是,除了int之外,没有使用原始类型的测试。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/252732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档