c++ - 航空公司预订链表程序

标签 c++ object linked-list generalization

我目前有一个使用 list<string>flight_list 的航空公司预订数据库程序和 string name (这只是姓氏)。我需要扩展这个程序,以便它存储 Passenger 对象的链接而不是字符串,我假设将其更改为 list<Passenger> passenger_list ?我无法理解如何转换我的类中的函数以适应这种变化。乘客对象必须包含每位乘客的名字、姓氏和目的地。有很多,但这里仅举几个函数作为示例:

void read_from_file(list<string>& flist, string filename)
{
    string name;
    ifstream input(filename.c_str());
    while (input >> name) 
    {                   
        flist.push_back(name);
    }
    input.close();
}

void insert(list<string>& flist, string name)
{
    flist.push_back(name);
}

bool check_reservation(list<string>& flist, string name)
{
    list<string>::iterator i1, i2;
    i1 = flist.begin();
    i2 = flist.end();
    return (find(i1, i2, name) != i2);
}

我正在使用 main.cc 类和 database.cc 类。是的,如果有任何关于如何概括类的提示,我们将不胜感激。

最佳答案

我希望有帮助的一些观察(但要小心:以下代码未经测试)。

如果您的 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);));
}

在 C++98 中,您没有 lambda 函数,因此更加棘手。您必须构造一个仿函数进行比较;像

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.:抱歉我的英语不好。

编辑

抱歉:如果它为您的 Passenger 定义了 operator==,您的 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));
}

关于c++ - 航空公司预订链表程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327913/

相关文章:

c++ - 使用 2003 年的 c++ 代码是否可行?

c++ - 如何从JNA中的C字节指针返回字节数组

java - 传递到方法中的对象是否需要返回才能更改?

java - 向 2D LinkedList 添加一行

c++ - 我可以在模板参数中声明一个 constexpr lambda 吗?

c++ - 在 C++11 中通过 const 迭代器进行销毁

javascript - 如何在Javascript中使用where条件获取对象名称数据列表?

javascript - 将对象数组转换为数组列表(javascript)

python - 递归地颠倒链表中数字的顺序

java - 遍历链表 Java 的实现