我有一个方法可以检查列表中是否有与参数同名的元素。如果找到它,我想返回一个指向它的指针,如果该方法没有找到任何内容,则返回一个空指针。这是功能:
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++;
}
}
答案 0 :(得分:5)
问题是你试图获取元素的副本:
Place current = *iterator;
插入方法代码中的。您需要使用引用。请尝试:
Place ¤t = *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
,并不是最好的主意。在编写这行代码之前,我犹豫了一下。