为什么C++sort()函数不以sort(vectorname)形式工作,而以sort形式工作(vectorname.b

Why does the C++ sort() function not work in the sort(vectorname) form whereas it works as sort(vectorname.begin(), vectorname.end())?

本文关键字:vectorname 工作 sort 而以 C++sort 函数 为什么      更新时间:2023-10-16

有人能解释为什么当矢量的名称放在括号内时,std::sort()函数不起作用吗,例如sort(vectorname),而是发出编译器错误消息:

  dictionary.cpp:20:12: error: no matching function for call to ‘sort(std::vector<std::__cxx11::basic_string<char> >&)’
  sort(words);

而如果它是以CCD_ 3的形式写的,它工作正常吗?

以下是详细信息:

/* This is a dictionary program which is intended to
(1) read in separate words typed in the command line,
(2) sort them, and 
(3) output them alphabetacally.
I am asking about lines #25 and #26.
*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    vector<string> words;
    for(string word; cin>>word;) {
        words.push_back(word);
    }
    cout<<"Number of words: "<<words.size()<<'n';
    //sort(words.begin(), words.end()); //This method works ok
    sort(words);//But this one doesn't work
    for(int i=0; i<words.size(); ++i) {
        if(i==0 || words[i-1]!=words[i]) {
            cout<<words[i]<<'n';
        }
    }
}

这是在Ubuntu 15.10操作系统上,使用g++5.2.1编译器。

当您调用C++函数时,您会向它传递参数。std::sort函数处理元素的"范围",在C++中,您可以通过一对"迭代器"指定范围,迭代器表示范围的开始和结束。因此,在今天的C++中,范围不是一个单一的对象,而是由两个对象描述的概念性事物。

这是一个非常灵活的设计,因为它允许std::sort处理任何范围,这些范围可以由一对表示开始和结束的迭代器来描述(例如,您可以通过传递指向容器开始和中间的迭代程序来对容器的前半部分进行排序,也可以通过传递指针到数组开始和结束来对数组进行排序)。因此,要调用std::sort,需要传递两个参数,它们必须是描述要排序的范围的迭代器

但这种灵活性是以方便为代价的:如果你有一个包含一系列元素的对象,比如vectorname,它是一个单独的参数,而不是两个迭代器参数,所以你不能把它传递给std::sort。相反,您可以调用begin()end()成员函数来从中获得一对迭代器

然而,C++计划进行一些更改,以指定标准算法的新版本,包括sort,它使用描述范围的单个对象。因此,将来您将能够将范围表示为描述该范围的一对迭代器,或者直接表示范围的单个对象。

简短的回答是:"因为std::sort被定义为接收一对迭代器,而不是容器。"

有点尖刻的回答是:"因为您包含了<algorithm>而不是"boost/range/algorithm/sort.hpp""。

一个更好(但仍然有点尖刻)的答案是"因为您包含了<algorithm>而不是"range/v3/algorithm""。

抛开Snark不谈,如果您不喜欢显式地传递begin()end()迭代器,我真的建议您查看Eric Neibler的范围库。即使你不介意这一特定的语法,我还是建议你看看它——我认为这是一个经过深思熟虑的设计,而且它正朝着被纳入C++标准的未来版本的方向发展。

std::sort适用于范围(由迭代器指定),因此它需要一个开始和结束的位置。它不必对整个容器进行排序。它的指定方式只是最通用的方式。

您可以在cppreference上阅读详细信息:http://en.cppreference.com/w/cpp/algorithm/sort

如果您想了解更多详细信息,请阅读标准:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4582.pdf

范围还不是标准C++库的一部分。更多细节在CppCon 2015:Eric Niebler"标准库范围"。

但是,您可以使用Boost Range库,特别是boost::sort

我发现std::sort有缺陷。是的,确实需要一个迭代器版本(以便能够对容器或动态数组的子范围进行排序)。

然而,它也可以有一个重载,它获取容器并从中获取迭代器