Sha*_*ter 4 c++ containers iterator stl generic-programming
我已经设法绕过一些C++的功能(for_each,映射函数,使用迭代器......)但是用于接收泛型容器和迭代器的模板和函数参数列表的构造仍然无法实现.我有一个实际的例子,我希望有人可以为我说明:
使用以下函数处理传入的std :: vector并构建一个进程的许多数据点/迭代的运行总计:
/* 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 */
Run Code Online (Sandbox Code Playgroud)
上面的工作,但我宁愿有一个函数,它接受迭代器并执行此求和.更好的是,使用推导类型的通用参数列表而不是指定容器类型,即:
UpdateRunningTotal (iteration_data.begin(), iteration_data.end(), running_total.begin());
Run Code Online (Sandbox Code Playgroud)
我现在真的迷失了,需要一些指导来找到如何定义模板和参数列表以使函数通用.模板和函数定义是什么样的?我已经熟悉使用STL功能执行此特定任务的方法 - 我正在寻找通用功能/模板定义的说明.
你可以使用std::transform
和std::plus
:
std::transform(iteration_data.begin(), iteration_data.end(),
running_total.begin(), iteration_data.begin(), std::plus<int>());
Run Code Online (Sandbox Code Playgroud)
在你的功能中,那将是:
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>());
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
448 次 |
最近记录: |