返回列表元素的指针if具有相同的名称

时间:2015-10-29 12:42:27

标签: c++ list

我有一个方法可以检查列表中是否有与参数同名的元素。如果找到它,我想返回一个指向它的指针,如果该方法没有找到任何内容,则返回一个空指针。这是功能:

Place *PlacesMap::Check(string name) {
    for (list<Place>::iterator iterator = map.begin(); iterator != map.end(); iterator++) {
        Place current = *iterator;
        if (current.GetName() == name)
            return &*iterator;
    }
    return nullptr;
}

地方有一个名称和信息,两个字符串,即类:

class Place {

private:
    string name;
    string info;

public:
    Place();
    Place(string name, string info);

    inline string GetName() {
        return name;
    }

    inline string GetInfo() {
        return info;
    }

    inline void Set(string newName, string newInfo) {
        name = newName;
        info = newInfo;
    }
};

当我在地方列表中插入另一个地方时,如果已经有一个同名的元素,它只会更新信息。为此,我遍历列表,检查是否已有一个具有该名称的地方,如果有更新信息,那就可以了。但是当我尝试插入已经存在的地方时,它会更新信息,并在使用Check方法检查后,它仍会显示旧信息。我在Check方法上做错了什么?

这是insert方法的实现:

void PlacesMap::Insert(Place p) {
    if (!map.empty()) {
        for (list<Place>::iterator iterator = map.begin(); iterator != map.end(); iterator++) {
            Place current = *iterator;
            if (current.GetName() == p.GetName())  {
                current.Set(p.GetName(), p.GetInfo());
            } else if ((iterator == --map.end())) {
                map.insert(iterator, p);
                counter++;
            }
        }
    } else {
        map.insert(map.end(), p);
        counter++;
    }
}

2 个答案:

答案 0 :(得分:5)

问题是你试图获取元素的副本:

Place current = *iterator;
插入方法代码中的

。您需要使用引用。请尝试:

Place &current = *iterator;

答案 1 :(得分:3)

这部分Insert功能

Place current = *iterator;
if (current.GetName() == p.GetName())  {
    current.Set(p.GetName(), p.GetInfo());

将节点的副本创建为current,然后更新副本。应该这样做

iterator->Set(p.GetName(), p.GetInfo());

顺便说一句,对于iterator类型的对象使用变量名iterator,并不是最好的主意。在编写这行代码之前,我犹豫了一下。