没有用于调用 sort() 的匹配函数

no matching function for call to sort()

本文关键字:函数 用于 调用 sort      更新时间:2023-10-16

我正在通过编程:使用C++的原则和实践(第 2 版)自学,我在向量部分。我可以复制并粘贴他们的代码,但它仍然不起作用。我的代码如下。

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;

int main()
{
    cout << "Please enter the temperatures for the last five daysn";
    vector<double> temperatures;
    for(double temp; cin >> temp;){
        temperatures.push_back(temp);
    }
    double sum = 0;
    for (double temp : temperatures){
        sum += temp;
    }
    cout << "Mean temperature is " <<(sum / temperatures.size()) << endl;
    sort(temperatures);
    cout << "Median temperature is " << temperatures[temperatures.size()/2];
}

感谢帮助,解释更好。

模板函数std::sort需要一对迭代器作为其参数(即范围)和可选的比较器。没有可以直接应用于容器的sort函数。你从哪里得到称之为sort(temperatures)的想法?要对整个temperatures向量进行排序,应将其称为 std::sort(temperatures.begin(), temperatures.end()) 。我相信这本书有相当多的例子可以相当清楚地证明这一点。

此外,标准库头通常应作为#include <algorithm>包含在内,即使用<...>语法,而不是"..."语法。

首先,您应该更正此问题:

#include "iostream"
#include "vector"
#include "algorithm"

对此:

#include <iostream>
#include <vector>
#include <algorithm>

现在,有两个版本的std::sort如下:

  1. void sort( RandomIt first, RandomIt last );
  2. void sort( RandomIt first, RandomIt last, Compare comp );

第一个采用两个随机迭代器,例如:

std::vector<int> vec {5,4,3,2,1};
std::sort(vec.begin(), vec.end());

默认情况下,这将按升序对元素进行排序。

排序的第二个版本有一个附加参数,允许您使用自己的比较函数对元素进行排序,函数必须返回布尔值。

例:

bool comp(const int &a, const int &b)
{
    return a > b;
}

并调用排序:std::sort(vec.begin(), vec.end(), comp);将按降序对它们进行排序。

Lambda 经常被用来代替比较函数,可以这样做:

std::sort(vec.begin(), vec.end(), [](const int &a, const int &b) {return a < b;});

顺便说一下,要获得"std_lib_facilities.h":

  1. http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h
  2. 将文本复制到文本编辑器中并将文件另存为 std_lib_facilities.h,并将其包含在项目中:
  3. #include "std_lib_facilities.h"

首先,关于标题,本书中的代码需要标题"std_lib_facilities.h",可以在本书的支持网站上找到,并在本书的附录C中将标题集成到您的项目中。

在代码中,他做到了: #include "std_lib_facilities.h"项目中用户定义的标题的正确方法,但以这种方式包含标准库标题是完全错误的。标准库标头必须使用#include <...>表示法包含在内。在他的书中,他从未包含带有#include "..."符号的标准库标题。


现在,关于种类(温度)的实际问题,这个版本的sort()在他自己的头文件"std_lib_facilities.h"中可用,使初学者在早期阶段不知道迭代器的技术细节的情况下可以轻松使用sort()。

因此,要使用该版本的排序,要么#include "std_lib_facilities.h",要么使用其他版本的排序,其中之一是:

sort(temperatures.begin(), temperatures.end());