Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 累积和#x27的要求是什么;s函子?_C++_Language Lawyer_Functor_Accumulate_Binary Operators - Fatal编程技术网

C++ 累积和#x27的要求是什么;s函子?

C++ 累积和#x27的要求是什么;s函子?,c++,language-lawyer,functor,accumulate,binary-operators,C++,Language Lawyer,Functor,Accumulate,Binary Operators,我在这里写了一个答案:which使用 函子必须是具有如下签名的二进制函数:Ret op(const auto&a,const auto&b)但是: 签名不需要有常量& 对二进制函子的要求是: 不得使任何迭代器(包括结束迭代器)无效,或修改所涉及范围的任何元素 当对象本身是一个容器时,我不清楚对函子的要求。例如,这样的事情是允许的吗 const auto range = { 0, 1, 2, 3 }; const auto Ret = accumulate(cbegin(range), cend(

我在这里写了一个答案:which使用

函子必须是具有如下签名的二进制函数:
Ret op(const auto&a,const auto&b)
但是:

签名不需要有
常量&

对二进制函子的要求是:

不得使任何迭代器(包括结束迭代器)无效,或修改所涉及范围的任何元素

当对象本身是一个容器时,我不清楚对函子的要求。例如,这样的事情是允许的吗

const auto range = { 0, 1, 2, 3 };
const auto Ret = accumulate(cbegin(range), cend(range), vector<int>(), [](auto& a, const auto& b){
    a.push_back(b);
    return a;
});
const auto range={0,1,2,3};
const auto Ret=累加(cbegin(范围)、cend(范围)、vector()、[](自动&a、const auto&b){
a、 推回(b);
返回a;
});
是的,我承认这只是一个副本,我不是在要求一个更好的解决方案,我是在问这个解决方案的有效性。

我认为这个解决方案比CPP引用或其他任何东西更明确:

在范围
[第一,最后]
中,
二进制
既不能修改元素,也不能使迭代器或子范围无效

其中,
累计
声明为:

template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);

template <class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);
模板
T累计(先输入计数器,后输入计数器,T初始化);
模板
T累计(先输入计数器,后输入计数器,T初始化,二进制操作二进制运算);
因此,我认为您的示例是有效的,因为您没有影响范围
[第一,最后]

另一方面,该约束对于给定的范围非常有意义,因为您可以使用两个迭代器来定义它。
举个例子,想想如果它们是向量的开始迭代器和结束迭代器,在向量的末尾,您决定在
binary\u op


一旦向量调整大小,
accumulate
就会继续使用两个悬空指针。不好。

我很确定这是在谈论它所应用到的容器的迭代器。函子可以捕获它正在迭代的容器,并对其进行处理。考虑一个无序多集,可以使用累加来尝试“加倍”它中每个元素的数量。这是不允许的,因为向哈希多集添加元素可能会使迭代器无效。您不会“修改范围内的任何元素”和“不会使[范围内]的任何迭代器无效”,因此这在技术上是正确的。cppreference上的示例还显示了一个类似的带有
std::string
(可能不应该)的代码片段。您可能会发现这个相关的提案很有趣:@ArneVogel我发现这个提案太棒了!非常感谢你。我去寻找你的一篇随机帖子进行投票,并在
call\u once
once\u flag
上找到了你的帖子。这太好了,我从来都不知道这件事。现在我觉得我需要把你的答案通读一遍@ArneVogel我认为对Accountage的吸引主要是因为它可以生成
const
容器,而其他方法不能。我想这才是阿恩·沃格尔提案背后的真正动机。