gpt4 book ai didi

c++ - 如何仅使用元素成员函数和 STL 从容器中元素的成员函数中累积结果?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:39 25 4
gpt4 key购买 nike

我有一个元素容器,每个元素都有它的 size() 成员函数。我通过编写二进制操作 add_size 设法累积了容器元素的总大小:

#include <algorithm>
#include <vector>
#include <functional>
#include <numeric>
#include <iostream>

class A
{
int size_ ;

public:

A ()
:
size_(0)
{}

A (int size)
:
size_(size)
{}

int size() const
{
return size_;
}
};

template<typename Type>
class add_element
{
Type t_;

public:

add_element(Type const & t)
:
t_(t)
{}

void operator()(Type & t)
{
t += t_;
}
};

int add_size (int i, const A& a)
{
return i+=a.size();
}

using namespace std;

int main(int argc, const char *argv[])
{

typedef vector<A> Vector;

Vector v;

v.push_back(A(10));
v.push_back(A(5));
v.push_back(A(7));
v.push_back(A(21));
v.push_back(A(2));
v.push_back(A(1));

int totalSize = accumulate(v.begin(), v.end(), 0, add_size);

std::cout << totalSize << endl;

return 0;
}

这给出了正确的输出:

46

我想做的是不为 size 成员函数定义二进制操作 add_size,而是使用 mem_fun 和绑定(bind)器。我怎样才能做到这一点?我怎样才能有效地做到这一点?我从 add_element 开始,然后卡住了。

我需要在 C++03 中工作的解决方案。

最佳答案

我认为您的问题不恰当。看看您有什么:小型单行函数 add_size 和对 std::accumulate 的调用。 有什么不喜欢的?

您在某种程度上(可能出于公司原因)被限制使用 Boost.Bind 或 Boost.Lambda,更不用说 C++11(它标准化了 std::bind 和 lambda 表达式)。

您想消除它以支持 C++03 绑定(bind)器,它们在表达能力上非常有限(顺便说一句,这也是 Boost.Bind 和 Boost.Lambda 如此受欢迎的原因之一)和将需要比您目前拥有的更多的样板文件。看这个appendixC++ Standard Reference book by Nicolai Jusuttis .他实现了一个通用的 compose 模板,该模板与 std::bind2nd 和 friend 一起“很好地”工作。但是看看他使用哪些 header 来实现它:对,Boost.Bind 的。

最好的方法是简单地复制 Boost.Bind 和/或 Boost.Lambda,将它们放在您自己的源代码树中,然后将 namespace 重命名为您公司的 namespace 。检查这是否实际上与 Boost License 一致. Boost 甚至有一个 bcp 工具来为您提取所有包含的依赖项。然后使用您刚刚“编写”的绑定(bind)或 lambda 工具简单地编写您需要的任何内容。

TL;DR:不要重新发明轮子。熟悉 Boost。

关于c++ - 如何仅使用元素成员函数和 STL 从容器中元素的成员函数中累积结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16437733/

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