Как отсортировать и отобразить список объектов в C ++?

0

Я работаю над системой бронирования авиабилетов, где пользователь сможет выбрать способ сортировки и отображения списка. По сути, я создал список объектов, в которых членами объекта являются имена и коды нескольких городов. Тем не менее, я не уверен, как отсортировать этот список с помощью членов объекта, а затем отобразить элементы этого списка. Здесь я создаю и заполняю список.

Определение класса города:

#ifndef CITY_H
#define CITY_H
#include <iostream> 
#include <list>

using namespace std;

class City
{
protected:
    string name;
    string code;

public:
    City()
    {
        name = "";
        code = "";
    }
    void setName(string);
    void setCode(string);
    void addCities();
    void displayCities(const list<City> &);

    string getName();
    string getCode();

    friend ostream& operator<< (ostream& , City &);

};

    ostream& operator<< (ostream& , City &);
#endif //CITY_H

void City::addCities()
{
    ifstream cities;
    cities.open("cities.dat");

    list<City> cityList;

    string co = "", na = "";

    while (!cities.eof())
    {
        City c;
        cities >> co;
        cities >> na;

        c.setCode(co);
        c.setName(na);

        cityList.push_back(c);
    }
    displayCities(cityList);
}

Вот текстовый файл с информацией, которую я загружаю в список:

ATL Atlanta
ORL Orlando
DFW Dallas/Fort_Worth
NYC New York City
HAW Hawaii
CHI Chicago
LAX Los_Angeles

И это была моя попытка отобразить список:

void displayCities(const list<City> &cityRef)
{
    list<City>::iterator it;
    for (it == cityRef.begin(); it != cityRef.end(); ++it)
    {
        std::cout << (*it) << std::endl;
    }
}

ostream& operator <<(ostream& s, City& c)
{
    s << c.name << c.code;
    return s;
}
  • 0
    Я полагаю, что City - это не POD (вы должны включить его определение в вопрос), поэтому вы просто печатаете все, что указано итератором, а не полное содержание каждого элемента списка. Кроме того, ваше название не является точным, так как я не вижу ни попыток сортировки (ни запросов). Вы также должны указать, что вы хотите отобразить.
  • 0
    for (it == cityRef.begin(); должно быть for (it = cityRef.begin(); list<City>::iterator должен быть list<City>::const_iterator . Кроме того, код отображения выглядит нормально. (Я предполагаю, что вы определили operator << для вашего класса City ).
Показать ещё 1 комментарий
Теги:
object
list
sorting
printing

2 ответа

1

Вместо addCities вы действительно хотите перегрузить operator>> для своего класса City:

struct City { 
    std::string code, name;

    friend std::istream &operator>>(std::istream &is, City &c) { 
      return is >> c.code >> c.name;
    }
};

Затем вы можете прочитать данные (которые вы сейчас делаете неправильно, BTW) следующим образом:

std::ifstream cities("cities.dat");
std::vector<City> CityList{std::istream_iterator<City>(cities),
                           std::istream_iterator<City>());

Затем произведите что-то вроде:

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

И вы можете записать результат примерно так:

for (auto const &city : CityList) 
    std::cout << city << "\n";

Обратите внимание, что я сделал CityList вектором вместо std::list - последнее является ошибкой гораздо чаще, чем нет.

  • 0
    +1 После этой каденции я ожидал std::copy для заключительного вывода. Хороший ответ, кстати. (и вашему второму istream_iterator<city> нужен регистр фиксированного типа).
  • 0
    Почему использование списка будет ошибкой?
Показать ещё 2 комментария
0

Вы можете попытаться использовать std :: list :: sort, как вы можете видеть здесь

Очевидно, вам нужно определить свой метод сравнения.

  • 0
    @ спасибо за его форматирование
  • 0
    Вы не можете использовать std :: sort для списков. См. Stackoverflow.com/questions/2432857/…
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню