c ++迭代对象列表并删除对象

问题描述 投票:0回答:2

我有一个对象列表,我想删除某个对象,一旦它达到if条件。但我遇到了问题。主要是因为if条件是抛出错误。

另外我不知道是否需要创建一个临时文件夹值并让它成为我的if条件?老实说,我对迭代器很困惑,任何额外的信息都可能会有所帮助。

void removeFolder(string fName)
{
    list<Folder> folders = this->getFolders();
    for (list<Folder> itr = folders.begin(); itr != folders.end();)
    {
        if (fName == *itr)
            itr = folders.erase(itr);
        else
            ++itr;
    }
}
c++ list object iterator
2个回答
2
投票

我认为你有正确的想法,但你做错了。文件夹是:

list<Folder> folders

比你迭代不同的元素“文件夹”而不是“文件夹”:

for (list<folder> itr = folders.begin(); itr != folders.end();)

我认为这应该是:

for (list<Folder>::iterator itr = folders.begin(); itr != folders.end();)

现在,一旦你正在迭代正确的对象,进行有意义的比较,而不是字符串到对象:

if (fName == *itr)

而是比较字符串到字符串,我假设您的Folder类有一些方法来获取文件夹名称,即:

if (fName == (*itr).getFolderName())

0
投票

我确定已经在某个地方回答了这个问题,但代码很简单:

你只需要使用std::list<Folder>::remove_if()

void removeFolder(const std::string& fName)
{
    std::list<Folder>& folders = getFolders();
    folders.remove_if([&fName](Folder& item){return item.name == fName;});
}

正如其他人所指出的那样,我尝试修复的代码存在其他问题。特别是,您可能正在将某种name成员与fName变量进行比较。此外,没有必要通过值将fName字符串传递给removeFolder函数,并且可能您需要修改folders的本地副本,但是某些列表存在于函数外部。

© www.soinside.com 2019 - 2024. All rights reserved.