如果传递给它们的函数接受引用,STL 算法函数(如累积)是不是避免复制?

Posted

技术标签:

【中文标题】如果传递给它们的函数接受引用,STL 算法函数(如累积)是不是避免复制?【英文标题】:Do STL algorithms functions, like accumulate, avoid copy if the function passed to them accepts a reference?如果传递给它们的函数接受引用,STL 算法函数(如累积)是否避免复制? 【发布时间】:2017-05-15 21:32:29 【问题描述】:

例如,假设我想对一个范围(由开始和结束迭代器标识)进行排序。如果我将一个参数为两个 A& (A 是一个类) 的 lambda 函数传递给 std::sort ,那么 STL 算法是否会避免复制两个对象而直接调用我的排序函数?

【问题讨论】:

一个代码示例可能会更好地传达您的问题... 由于不允许更改谓词中的任何一个参数,将参数指定为const A& 将是理想的。在这种情况下,不,不会有复制。 【参考方案1】:

查看std::sort 参考,我们看到了

解引用的RandomIt的类型必须满足 MoveAssignable 和 MoveConstructible。

因此,可复制(CopyConstructible 或 CopyAssignable)不在此算法的要求中。这保证了它永远不会尝试复制您的对象。

【讨论】:

cppreference.org 是一个很棒的网站,但它不是“规范”。 @NicolBolas 它通常非常符合标准。无论如何,修正措辞,谢谢。

以上是关于如果传递给它们的函数接受引用,STL 算法函数(如累积)是不是避免复制?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的()操作符重载及STL传递比较函数

传递函数指针

在 C++ 中通过引用与按值将向量传递给函数

如何将哈希传递给 Perl 中的函数?

将引用传递给 C++ 构造函数并将它们保存为引用或非引用类型

C++ - 通过引用模板函数传递 STL 映射