从映射复制到指针列表

时间:2018-04-30 23:27:48

标签: c++ stdmap stdlist

我有一个有趣的任务,我有std::map CTurist(上一课)和unsigned变量。这是代码:

class CTurist
{
protected:
    string tName;
    int age;

public:
    CTurist() {};

    CTurist(string name, int age2)
    {
        tName = name;
        age = age2;
    }


    bool operator<(const CTurist& e) const
    {
        return age < e.age;
    }

    friend ostream& operator<<(ostream& os, const CTurist&& e);
    friend ifstream& operator>>(ifstream& is, CTurist&& e);
};

class CHotel:public CTurist
{
protected:

    string hName;
    int stars;
    int beds;
    map<CTurist, unsigned> Turisti;

public:
    unsigned Sum = 0;

    CHotel(){};

    CHotel(string hName2, int zvezdi, int legla)
    {
        hName = hName;
        stars = zvezdi;
        beds = legla;
    }



    int Compare()
    {
        list<CTurist*> list;

        int br=0;
        CTurist vyzrast;
        map<CTurist, unsigned>::iterator it = Turisti.begin();
        while (it != Turisti.end())
        {
            if (it->first < vyzrast)
            {
                br++;
            }
            else
            {
                list.push_back(std::move(&it->first));
            }
        }
    }
};

我知道它很长,但我认为最好给你所有的信息。

现在,底部的int Compare()功能是导致我出现问题的功能。

我必须检查游客的年龄是否高于或低于我在此称为vyzrast的参数。我们正在比较age。如果它低于它,那就非常直接了。

如果它在上面,我必须将这些游客添加到list<CTurist*>,也就是说。到指针列表。如果我从对象创建列表,而不是指针。没有运气,因此我在寻找建议如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

为什么要为operator重载使用右值引用?您应该const CTurist &使用operator<<CTurist&使用operator>>。您应该std::istream使用operator>>

friend ostream& operator<<(ostream& os, const CTurist &e);
friend istream& operator>>(istream& is, CTurist &e);

除此之外,Compare()在填充std::move()时没有理由使用std::list,因为它正在添加指针,而不是移动实际对象。

Compare()由于以下几个原因而无法正常胜出:

  1. it->first是一个实际的const CTurist对象,但您的std::list期待CTurist*指针。 std::map个键是const,因此&it->firstCTurist const *指针(指向const对象的非const指针),而不是CTurist*指针(非常量指针)对于非const对象)就像你期待的那样。

  2. 您的vyzrast对象未初始化。您根本没有为其age(和tName)成员分配任何值,因此您的比较结果是不确定的。

  3. 您没有在每次循环迭代中递增it迭代器,因此如果std::map不为空,您将陷入无限循环。

  4. 尝试更像这样的东西:

    int Compare()
    {
        std::list<const CTurist *> clist;
    
        int br = 0;
        CTurist vyzrast("", SomeAgeValueHere);
    
        std::map<CTurist, unsigned>::iterator it = Turisti.begin();
        while (it != Turisti.end())
        {
            if (it->first < vyzrast)
            {
                br++;
            }
            else
            {
                clist.push_back(&it->first);
            }
            ++it;
        }
    
        // use clist as needed...
    
        return SomeValueHere;
    }
    

    Live Demo