C++11 基于范围的算法是否可以完全独立于(并且针对任何)容器类型进行优化?

C++11 基于范围的算法是否可以完全独立于(并且针对任何)容器类型进行优化?,c++11,boost-range,range-v3,C++11,Boost Range,Range V3,我想知道boost::range或range_v3是否会像std::begin协调STL容器和类似C的数组那样协调自由函数和成员函数(我指的是编码泛型) 更具体地说,在自动调用std::list::sort给出的最佳实现的列表上调用std::sort对我来说更方便 最后,成员函数是否可以被视为其泛型函数的接口 仅对应(std::list::sort从未在客户机代码中调用)?AFAIK,您提到的两个库都没有直接处理这个问题。在C++17中有一种更普遍的方法来处理这类事情,包括使f(x)和x.f()

我想知道boost::range或range_v3是否会像std::begin协调STL容器和类似C的数组那样协调自由函数和成员函数(我指的是编码泛型)

更具体地说,在自动调用std::list::sort给出的最佳实现的列表上调用std::sort对我来说更方便

最后,成员函数是否可以被视为其泛型函数的接口
仅对应(std::list::sort从未在客户机代码中调用)?

AFAIK,您提到的两个库都没有直接处理这个问题。在C++17中有一种更普遍的方法来处理这类事情,包括使
f(x)
x.f()
等效,但正如我在上面的评论中提到的,我不清楚它是否能与range-v3的算法一起工作

我确实注意到range-v3的sort.hpp中有一条有趣的注释:
//TODO前向迭代器,比如EoP?
。所以,也许尼布勒确实有想法支持一种更通用的分类。(“EoP”是Alex Stepanov的编程元素。)


一个复杂问题是:泛型排序使用迭代器对值进行重新排序,而list::sort()则对链接本身进行重新排序。如果您关心迭代器在排序后指向什么,那么这种区别很重要,因此您仍然需要一种方法来选择所需的排序。甚至有人会说,如果语义不同,sort()不应该调用list::sort()17@sp2danny有人建议统一调用语法,使
f(x)
x.f()
大致相等。但是,我不确定它是否有帮助,因为range-v3将其算法实现为函数对象而不是函数模板。所以
sort(L)
实际上类似于
sort\u fn()(L)
。如果后者失败(因为
L
不是
RandomAccessRange
),它会返回原始语法并尝试L.sort()?我不确定。从我在论文中的观点来看,该提案解决OP问题的唯一方法是,如果他们选择替代方案#6(比亚恩的提案),这将使
sort(myList)
更喜欢成员函数
myList.sort()
。不过,我不确定是否会选择该选项,因为它可能会破坏代码。在我阅读时,如果
sort
是一个正常函数,则除了“不做任何事情”之外的任何选项都可以解决问题。但是,
ranges::sort
是函数对象的别名,所以我不确定会发生什么。