【问题标题】:c++ Iterating over a list of objects and deleting a objectc ++迭代对象列表并删除对象
【发布时间】:2019-02-12 05:36:20
【问题描述】:

我有一个对象列表,我想在某个对象达到 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;
    }
}

【问题讨论】:

  • Folder 是否与folder 相同?您是否编写了一个运算符来测试fName(即string)和*itr(即folder)的相等性?
  • 您将stringFolder 进行比较。如果您有一个返回 Folder 名称的函数,您可以使用它。例如。 if ( fName == (*iter).getName() ).

标签: c++ list object iterator


【解决方案1】:

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

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)

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

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

【讨论】:

  • 这将修改一个局部变量folders,该变量将在函数退出后被销毁。我猜这不是目的。
  • 另一种选择是if (*itr == fName),并有一个operator==Folderstring 进行比较。 Suggestions on how to write the overload.
【解决方案2】:

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

您只需要使用std::list&lt;Folder&gt;::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 的本地副本,而是函数外部存在的一些列表。

【讨论】:

  • 成员函数list&lt;T&gt;::remove_if与非成员函数std::remove_if是不同的东西。该成员不返回迭代器,并且包含擦除操作,因此不需要跟任何erase() 调用。
  • 谢谢!很高兴知道。固定。
  • 自从 C++17 引入了std::string_view,为了灵活性和效率,人们应该更喜欢传递std::string_view 而不是std::string const&amp;,除非实际需要0 终止符。不幸的是,没有保证 0 终止符的变体。另外,考虑更广泛地应用auto
猜你喜欢
  • 2020-07-30
  • 2011-02-27
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 2017-07-07
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多