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

时间:2015-06-13 02:53:48

标签: c++

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

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



using namespace std;


int main()
{
    cout << "Please enter the temperatures for the last five days\n";
    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];
}

感谢帮助,解释更好。

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

首先你应该纠正这个:

#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 );
  3. 第一个采用两个随机迭代器,例如:

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

    默认情况下,这会对升序中的元素进行排序。

    sort的第二个版本有一个额外的参数,允许你使用自己的比较函数对元素进行排序,函数必须返回bool。

    示例:

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

    调用sort: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"

答案 2 :(得分:2)

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

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

现在,关于排序(温度)的实际问题, 这个版本的sort()可以在他自己的标题中找到,&#34; std_lib_facilities.h&#34;使初学者很容易在不知道迭代器技术性的情况下使用sort()。

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

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