Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回列表元素';s指针是否具有相同的名称_C++_List - Fatal编程技术网

C++ 返回列表元素';s指针是否具有相同的名称

C++ 返回列表元素';s指针是否具有相同的名称,c++,list,C++,List,我有一个方法可以检查列表中是否有与参数同名的元素。如果找到了它,我想返回一个指向它的指针,如果该方法没有找到任何东西,则返回一个空指针。下面是函数: Place *PlacesMap::Check(string name) { for (list<Place>::iterator iterator = map.begin(); iterator != map.end(); iterator++) { Place current = *iterator;

我有一个方法可以检查列表中是否有与参数同名的元素。如果找到了它,我想返回一个指向它的指针,如果该方法没有找到任何东西,则返回一个空指针。下面是函数:

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;
}
当我在位置列表中插入另一个位置时,如果已经有同名的元素,它只会更新信息。要做到这一点,我遍历列表,检查是否已经有一个具有该名称的位置,如果有,我会更新信息,这很好。但是当我尝试插入一个已经存在的位置时,它会更新信息,并且在使用Check方法检查之后,它仍然显示旧信息。我在检查方法上做错了什么

这是插入方法的实现:

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++;
    }
}
void PlacesMap::Insert(Place p){
如果(!map.empty()){
for(list::iterator iterator=map.begin();iterator!=map.end();iterator++){
当前位置=*迭代器;
if(current.GetName()==p.GetName()){
current.Set(p.GetName(),p.GetInfo());
}else if((迭代器==--map.end()){
插入(迭代器,p);
计数器++;
}
}
}否则{
map.insert(map.end(),p);
计数器++;
}
}

问题是您试图将元素的副本放在行中:

Place current = *iterator;
在插入方法代码中。您需要使用引用。请尝试:

Place &current = *iterator;

问题是您试图获取行中元素的副本:

Place current = *iterator;
在插入方法代码中。您需要使用引用。请尝试:

Place &current = *iterator;

插入功能的这一部分

Place current = *iterator;
if (current.GetName() == p.GetName())  {
    current.Set(p.GetName(), p.GetInfo());
将节点的副本创建为当前副本,然后更新副本。应该可以

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

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

插入函数的这一部分

Place current = *iterator;
if (current.GetName() == p.GetName())  {
    current.Set(p.GetName(), p.GetInfo());
将节点的副本创建为当前副本,然后更新副本。应该可以

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

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

请同时提供您的插入方法。change
return&*iterator
to
返回迭代器
return¤t
如果我使用return¤t,它会给我一个警告:与返回的局部变量'current'关联的堆栈内存地址。@Minato,这些更改中的任何一个都是错误的<代码>&*迭代器
通常适用于这种情况。
Place current=*迭代器应该是
Place¤t=*迭代器在该行所在代码的两个点中。在
placemap::Check
中,这是一个风格/效率问题(原因
return¤t
不起作用)。在
Insert
中,这不仅仅是风格/效率。这是一个错误。请同时提供您的插入方法。更改
return&*迭代器
to
返回迭代器
return¤t
如果我使用return¤t,它会给我一个警告:与返回的局部变量'current'关联的堆栈内存地址。@Minato,这些更改中的任何一个都是错误的<代码>&*迭代器
通常适用于这种情况。
Place current=*迭代器应该是
Place¤t=*迭代器在该行所在代码的两个点中。在
placemap::Check
中,这是一个风格/效率问题(原因
return¤t
不起作用)。在
Insert
中,这不仅仅是风格/效率。这是一个bug。谢谢,我会记住迭代器的命名。谢谢,我会记住迭代器的命名。