重构一个“愚蠢的"将函数转换为具有容器迭代器的通用 STL 样式

Refactoring a quot;dumbquot; function into generic STL-style with iterators to containers(重构一个“愚蠢的将函数转换为具有容器迭代器的通用 STL 样式)
本文介绍了重构一个“愚蠢的"将函数转换为具有容器迭代器的通用 STL 样式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经设法了解了 C++ 的一些功能能力(for_each、映射函数、使用迭代器...),但是用于接收通用容器和迭代器的模板和函数参数列表的构造仍然让我难以理解.我有一个实际的例子,希望有人可以为我说明:

I've managed to wrap my head around some of C++'s functional capacities (for_each, mapping functions, using iterators...) but the construction of the templates and function argument lists for taking in generic containers and iterators still eludes me. I have a practical example I'm hoping someone can illustrate for me:

采用以下函数来处理传入的 std::vector 并构建一个进程的许多数据点/迭代的运行总数:

Take the following function that processes an incoming std::vector and builds a running total of many data-points/iterations of a process:

/* the for-loop method - not very savvy */
void UpdateRunningTotal (int_vec& total, int_vec& data_point) {
  for (int i = 0; i < V_SIZE; i++) {
    total[i] += data_point[i];
  }
}

typedef int_vec std::vector<int>;
int_vec running_total (V_SIZE, 0);  // create a container to hold all the "data points" over many iterations
/* further initialization, and some elaborate loop to create data points */

UpdateRunningTotal (running_total, iteration_data);
/* further processing */

以上方法可行,但我更希望有一个函数,它接受迭代器并执行此求和.更好的是,有一个类型推导的通用参数列表,而不是指定容器类型,即:

The above works, but I'd much rather have a function that takes iterators and performs this summation. Even better, have a generic parameter list with the type deduced instead of specifying the container type, i.e.:

UpdateRunningTotal (iteration_data.begin(), iteration_data.end(), running_total.begin());

在这一点上我真的迷失了,需要一些指导来找到如何定义模板和参数列表以使函数通用.模板和函数定义会是什么样子?我已经熟悉使用 STL 功能执行此特定任务的方法 - 我正在寻找通用函数/模板定义的说明.

I'm really lost at this point and need a little guidance to find how to define the template and argument lists to make the function generic. What would the template and function definition look like? I'm already familiar with a way to perform this specific task using STL functionality - I'm looking for illustration of the generic function/template definition.

推荐答案

你可以使用 std::transformstd::加号:

You could use std::transform and std::plus:

std::transform(iteration_data.begin(), iteration_data.end(),
                running_total.begin(), iteration_data.begin(), std::plus<int>());

在你的函数中,那将是:

And in your function, that would be:

template <typename Iter1, typename Iter2>
void UpdateRunningTotal(Iter1 pBegin, Iter1 pEnd, Iter2 pBegin2)
{
    typedef typename std::iterator_traits<Iter1>::value_type value_type;

    std::transform(pBegin, pEnd, pBegin2, pBegin, std::plus<value_type>());
}

这篇关于重构一个“愚蠢的"将函数转换为具有容器迭代器的通用 STL 样式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

What is the proper function for comparing two C-style strings?(比较两个 C 风格字符串的正确函数是什么?)
Image Capture with OpenCV - Select Timeout Error(使用 OpenCV 捕获图像 - 选择超时错误)
SHA256 HMAC using OpenSSL 1.1 not compiling(使用 OpenSSL 1.1 的 SHA256 HMAC 未编译)
How to make a Debian package depend on multiple versions of libboost(如何制作一个Debian包依赖于多个版本的libboost)
Why does strcpy_s not exist anywhere on my system?(为什么我系统上的任何地方都不存在 strcpy_s?)
Simplest way to get current time in current timezone using boost::date_time?(使用 boost::date_time 在当前时区获取当前时间的最简单方法?)