Я работаю над системой бронирования авиабилетов, где пользователь сможет выбрать способ сортировки и отображения списка. По сути, я создал список объектов, в которых членами объекта являются имена и коды нескольких городов. Тем не менее, я не уверен, как отсортировать этот список с помощью членов объекта, а затем отобразить элементы этого списка. Здесь я создаю и заполняю список.
Определение класса города:
#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;
}
Вместо 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
- последнее является ошибкой гораздо чаще, чем нет.
std::copy
для заключительного вывода. Хороший ответ, кстати. (и вашему второму istream_iterator<city>
нужен регистр фиксированного типа).
Вы можете попытаться использовать std :: list :: sort, как вы можете видеть здесь
Очевидно, вам нужно определить свой метод сравнения.
City
- это не POD (вы должны включить его определение в вопрос), поэтому вы просто печатаете все, что указано итератором, а не полное содержание каждого элемента списка. Кроме того, ваше название не является точным, так как я не вижу ни попыток сортировки (ни запросов). Вы также должны указать, что вы хотите отобразить.for (it == cityRef.begin();
должно бытьfor (it = cityRef.begin();
list<City>::iterator
должен бытьlist<City>::const_iterator
. Кроме того, код отображения выглядит нормально. (Я предполагаю, что вы определилиoperator <<
для вашего классаCity
).