Некоторые замечания, которые, я надеюсь, полезны (но будьте осторожны: следующий код не проверен).
Если ваше Passenger
нуждается в имени, фамилии и адресате, я полагаю, что существует конструктор Passenger
с тремя строковыми параметрами.
Я полагаю, что ваш Read_from_file()
должен стать чем-то вроде
void read_from_file(list<Passenger> & flist, string const & filename)
{
string firstN, lastN, dest;
ifstream input(filename.c_str());
while (input >> firstN >> lastN >> dest)
{
flist.push_back(Passenger(firstN, lastN, dest)); // for C++98
// flist.emplace_back(fistN, lastN, dest); // for C++11/14
}
// input.close(); no need for close: file closed by destructor
}
Предложение: параметры Передавать по ссылке, и используя const
, когда это возможно.
Аналогично, insert()
можно регулировать простым способом (в двух разных режимах, в зависимости от того, используете ли вы в последнее время C++ компилятор или предварительно C++ 11)
void insert(list<Passenger> & flist, string const & firstN,
string const & lastN, string const & dest)
{
flist.push_back(Passenger(firsN, lastN, dest)); // C++98 version
// flist.emplace_back(firsN, lastN, dest); // C++11/14 version
}
Менее очевидно, как check_reservation()
. И действительно зависит от вопроса C++ 98/C++ 11.
Я полагаю, что вы хотите check_reservation()
, которые хотят найти Passenger
давая имя, фамилию и назначения.
В C++ 11 является довольно легко (предположим, что ваш Passenger
содержит firsN
, а lastN
и dest
члена)
bool check_reservation(list<Passenger> const & flist, string const & firstN,
string const & lastN, string const & dest)
{
return flist.cend() != find_if(flist.cbegin(), flist.cend(),
[&](Passenger const & p)
(return (fistN == p.fistN)
&& (lastN == p.lastN)
&& (dest == p.dest);));
}
В 98 не имеют функции лямбда-C++ так сложнее , Вы должны построить функтор для сравнения; что-то вроде
struct person_eq : std::unary_function <Passenger, bool>
{
string const & f;
string const & l;
string const & d;
person_eq (string const & f0, string const & l0, string const & d0)
: f(f0), l(l0), d(d0)
{}
bool operator() (Passenger const & p) const
{ return (p.firstN == f) && (p.lastN == l) && (p.dest == d); }
};
и ваш check_reservation()
должен стать чем-то вроде
bool check_reservation(list<Passenger> const & flist, string const & firstN,
string const & lastN, string const & dest)
{
return flist.cend() != find_if(flist.cbegin(), flist.cend(),
person_eq(fistN, lastN, dest));
}
Повторяю: этот код не тестировался, так что будьте осторожны.
p.s .: извините за мой плохой английский.
Редактировать
К сожалению: если он определен operator==
для вашего Passenger
, ваш check_reservation()
может быть очень легко
bool check_reservation(list<Passenger> const & flist, string const & firstN,
string const & lastN, string const & dest)
{
return flist.cend() != find(flist.cbegin(), flist.cend(),
Passenger(firstN, lastN, dest));
}
Вы можете рассмотреть, чтобы задать этот вопрос по адресу: http://programmers.stackexchange.com/ –