11

我一直想知道为什么没有

sort(v);// same as std::sort(v.begin(),v.end())

如果我很久以前没记错的话,我看到一个 boostcon 剪辑,演讲者说这个概念是必需的,但我不明白为什么。顺便说一句,我尝试了这个(在 VS 11 中),从我所看到的情况来看,它工作得很好。

template <typename Container>
void sortfx(Container& c)
{
    std::sort(c.begin(),c.end());
}
int main()
{

    std::vector<double> v;
    //std::list<double> v; this causes compile errors
    v.push_back(1701);
    v.push_back(1729);
    v.push_back(74656);
    v.push_back(2063);
    sortfx(v);
    assert(std::is_sorted(begin(v),end(v)));

}

编辑:Bjarne 自己解释了这些概念,并以排序为例 :) https://www.informit.com/articles/article.aspx?p=2080042&WT.rss_f=Article&WT.rss_a=An%20Interview%20with%20Bjarne%20Stroustrup&WT .rss_ev=a

4

6 回答 6

10

需要概念的不是std::sort(v)->扩展,而是替代排序函数采用附加参数进行比较 - 。std::sort(v.begin(), v.end())std::sort(v.begin(), v.end(), compare)

如果您有 call std::sort(v, compare),则实现std::sort(start, end)需要将其与非容器区分开来的概念。

标题<algorithm>中充满了具有此类问题的模板。

于 2012-06-24T10:06:39.777 回答
5

来自学习标准 C++ 作为一种新语言 (PDF) Stroustrup,C/C++ 用户期刊。第 43-54 页。1999 年 5 月:

在这种情况下,普通的 sort(v) 会更简单,但有时我们想要对容器的一部分进行排序,因此更一般地指定我们想要排序的内容的开始和结束。

这对我来说很有意义。正如您所展示的,创建一个包装器很简单,并且在没有包装器的情况下使用它并不是非常麻烦。花费一秒钟sort()的时间似乎并不值得。

于 2012-06-24T02:50:23.293 回答
3

<algorithm>函数不能直接在容器上工作。它们只与迭代器交互,没有任何容器的上下文知识。如果您出于自己的目的使用短的全范围排序符号,我认为没有什么害处,但是您必须假设对象具有开始/结束接口,这也恰好是双向迭代器。

于 2012-06-24T02:33:10.773 回答
1

这没有什么需要概念的。范围实际上并不比迭代器复杂。

于 2012-06-24T02:37:42.427 回答
1

如果您只想对容器的一个子集进行排序怎么办?

我最近几乎发布了一个类似的问题,关于为什么for_each不是成员函数Container而不是独立的。IEv.for_each([&sum] (int i) { sum += i; });

于 2012-06-24T02:39:53.410 回答
0

这不需要概念——但是(正如在 C++11 标准化期间提出的那样)它们会使实现这一点变得相当容易。

就目前而言,您可以通过为std::sort. 当然,问题在于这std::sort不是唯一的算法,因此毫无疑问,您也希望对许多其他算法也这样做(很可能几乎所有算法)。

概念(特别是概念图,如果有记忆的话)将提供一种相当干净的方式来以相对集中的方式提供(等效的)所有这些重载,因此您将所有这些适配器放在一个地方而不是 N 个地方(一个对于每个算法)。更好的是,只要它们符合正常约定,它也适用于其他算法。

目前相当多的人认为范围是应该处理的方式——算法应该在范围上运行,并且任何容器都应该定义一个范围(但也应该有其他方法来定义范围)。虽然这可能作为一个总体想法很好,但似乎(至少在我看来)对于应该构成一个范围的确切细节、应该如何定义它们等方面存在相当多的分歧。

如果你真的想探索这个,Boost 已经有一个范围库,其中包括大多数标准算法的基于范围的版本(以及许多其他算法)。至少在内存服务的情况下,这包括一些从容器创建范围的适配器,因此sort(c)无需显式指定范围或迭代器即可工作。

于 2013-05-28T17:36:39.400 回答