如何在不使用复制函数的情况下对vector中存储有日/月/年的实例进行排序

How to sort an instance with day/month/years stored in a vector without using the copy function

本文关键字:存储 排序 实例 vector 复制 情况下 函数      更新时间:2023-10-16

我在上一门c++入门课,我们的任务是创建一个程序,从一个文件中获取有关天气的数据,将其输入到一个数组中,然后按降序对其进行排序(其中最新的数据位于数组的第一个索引中),并输出。

我可以让我的排序函数对年份进行排序,但是一旦年份相同并且按月排序,我就会遇到麻烦。更麻烦的是,我们还没有学习sort()函数,所以我们不允许在代码中使用它。

我已经附上了我到目前为止的东西,但要注意,它很草率,没有评论。这是因为它是以代码块的形式在线提交的,有时剩下的部分代码是为我们编写的。我已经尽力把它拼凑起来了,但有些地方可能没有意义/出了问题。sortData函数在底部,我最近尝试的解决方案还在那里。很明显,它不起作用,但也许它会帮助我如何处理这个问题。

任何帮助都非常感谢!

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
struct WeatherData {
   int day;
   int month;
   int year;
   int clouds;
   double temp;
   double wind;
   string watch;
};
class WeatherStation {
private:
    vector<WeatherData> m_data;
public:
    WeatherStation();
    int getNumData();
    WeatherData getData(int);
    void sortData();
    void addData(const WeatherData&);
};
int main() {
   string line;
   string file_name;
   cin >> file_name;
   //Weather variables
   int day, month, year, clouds;
   double wind, temp;
   string watch;
   WeatherStation station;
   istringstream sin;
   ifstream fin;
   string watchLine;
   fin.open(file_name.c_str());
    if(fin.fail()) {
        cout << "Could not open file.n";
        return 1;
    }
    while(getline(fin, line)) {
        sin.clear();
        sin.str(line);
        sin >> day >> month >> year >> clouds >> temp >> wind >> watch;
        getline(sin, watchLine);
        watch = watch + watchLine;
        WeatherData data;
        data.day = day;
        data.month = month;
        data.year = year;
        data.clouds = clouds;
        data.temp = temp;
        data.wind = wind;
        data.watch = watch;
        station.addData(data);
    }
    station.sortData();
    int i;
    for(i = 0; i < getNumData(); i++) {
        cout << "Weather data for " << station.getData(i).month << "/";
        cout << station.getData(i).day << "/";
        cout << station.getData(i).year << ": ";
        cout << "Temp: " << fixed << showpoint << setprecision(2) << station.getData(i).temp;
        cout << ", Wind: " << fixed << showpoint << setprecision(3) << station.getData(i).wind;
        cout << ", Clouds: " << station.getData(i).clouds;
        cout << "nNotes: " << setw(28) << right << station.getData(i).watch << "nn";
    }
    return 0;
}
int WeatherStation::getNumData() {
    return m_data.size();
}
WeatherData WeatherStation::getData(int index) {
    return m_data[index];
}
void WeatherStation::addData(const WeatherData& data) {
    m_data.push_back(data);
}
void WeatherStation::sortData() {
    int i, j, k, l, firstYear, firstMonth;
    WeatherData tempData;
    for(i = 0; i < m_data.size(); i++) {
        firstYear = i;
        for(j = i + 1; j < m_data.size(); j++) {
            if(m_data[j].year > m_data[firstYear].year) {
                firstYear = j;
            }
            else if(m_data[j].year == m_data[firstYear].year) {
                for(k = 0; k < m_data.size(); k++) {
                    firstMonth = k;
                    for(l = k + 1; l < m_data.size(); l++) {
                        if(m_data[l].month > m_data[firstMonth].month) {
                            firstMonth = l;
                        }
                    }
                }
            }
        }
        if(firstYear != i) {
            tempData = m_data[i];
            m_data[i] = m_data[firstYear];
            m_data[firstYear] = tempData;
        }
        else if(firstMonth != k) {
            tempData = m_data[k];
            m_data[k] = m_data[firstMonth];
            m_data[firstMonth] = tempData;
        }
    }
}

如果您将变量名称从firstYear更改为latestDate,您可能会发现它更清晰。firstYear让你觉得你只有一年的时间去工作,但你却有整个WeatherData结构去工作。

您不需要第三个内循环(您当前代码中的k循环)-您可以在检查时比较每个项目的年,月和日。

所以你可以输入

if(m_data[j].year > m_data[latestDate].year) {
    latestDate = j;
}
else if(m_data[j].year == m_data[latestDate].year) {
    if(m_data[j].month> m_data[latestDate].month) {
        latestDate = j;
    }
    else if(m_data[j].month == m_data[latestDate].month) {
        ... do the same for day

理想情况下,您可以将其封装在WeatherData的成员函数中,甚至作为一个独立的比较函数,该函数接受两个WeatherData对象,但如果任务需要,您可以将其留在sort方法中。