【问题标题】:How to sort and display a list of objects in C++?如何在 C++ 中对对象列表进行排序和显示?
【发布时间】:2013-11-22 22:10:03
【问题描述】:

我正在开发一个航空公司预订系统,用户可以在该系统中选择他们希望如何对列表进行排序和显示。本质上,我创建了一个对象列表,其中对象成员是几个城市的名称和代码。但是,我不确定如何按对象成员对该列表进行排序,然后显示该列表的成员。这是我创建和填充列表的地方。

城市类定义:

#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;
}

【问题讨论】:

  • 我想City 不是 POD(你应该在问题中包含它的定义)所以你只是打印迭代器指向的任何内容,而不是每个元素的全部内容列表。此外,您的标题不准确,因为我没有看到任何排序尝试(也没有请求)。您还应该指定要显示的内容。
  • for (it == cityRef.begin(); 应该是 for (it = cityRef.begin();list&lt;City&gt;::iterator 应该是 list&lt;City&gt;::const_iterator。除此之外,显示代码看起来还可以。 (我假设你已经为你的City 类定义了operator &lt;&lt;)。
  • 您的代码将读取最后一行的垃圾代码,因为它只会在读取任何内容之前检查ifstream 的状态,请参阅stackoverflow.com/questions/4258887/… 和此处的许多其他问题。

标签: c++ list sorting object printing


【解决方案1】:

你真的想为你的City 类重载operator&gt;&gt; 而不是addCities

struct City { 
    std::string code, name;

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

然后你可以像这样读取数据(你目前做错了,顺便说一句):

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 ——后者通常是一个错误。

【讨论】:

  • +1 在那个节奏之后,我预计结束输出是std::copy。不错的答案,顺便说一句。 (而您的第二个 istream_iterator&lt;city&gt; 需要固定类型的大小写)。
  • 为什么使用列表会出错?
  • @ShyGuy:基本上是因为他似乎没有做任何利用std::list 擅长的(少数)事情(例如,在某个预定点进行大量插入或删除)列表的中间)。缺少这些,list 主要只是浪费缓存和内存空间。
【解决方案2】:

您可以尝试使用 std::list::sort,正如您在 here 中看到的那样

您显然需要定义比较方法。

【讨论】:

猜你喜欢
  • 2010-10-29
  • 2016-11-03
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多