繁体   English   中英

从项目成员 function 的列表中删除列表项

[英]Remove a list item from list in the item's member function

假设我有一个列表list<Item> ,并且

class Item {
 public:
  Item(list<Item>& l); // l is the list the item is in.

  RemoveItself() {...} // remove this from l.
}

当我调用item.RemoveItself()时,它会将自身从列表中删除。 如果我自己实现这个,我可以在Item中有prev_ptrnext_ptr ,然后一切都很容易。 我想知道是否有办法使用 STL 来做到这一点?

您的list包含Item对象,这些对象将是您插入list中的任何Item的副本。 因此,您必须使用std::find_if()list::erase()list::remove_if()来删除比较等于*this的元素,例如:

class Item {
private:
  list<Item> &l;

public:
  Item(list<Item> &l) : l(l) {}

  void RemoveItself() {
    auto iter = std::find_if(l.begin(), l.end(),
      [this](const Item &elem){
        return true/false based on some condition of elem and this representing the same item...;
      }
    );
    if (iter != l.end())
      l.erase(iter);

    // or:
    l.remove_if(
      [this](const Item &elem){
        return ...;
      }
    );
  }
};

这可能不是你想要的。 一个Item*指针列表可能更合适( list<Item*> ),例如:

class Item {
private:
  list<Item*> &l;

public:
  Item(list<Item*> &l) : l(l) {}

  void RemoveItself() {
    auto iter = std::find(l.begin(), l.end(), this);
    if (iter != l.end())
      l.erase(iter);

    // or:
    l.remove(this);
  }
};

在这种情况下,如果Item()构造函数将this添加到list ,那么它也可以将iterator保存到新元素,然后它可以稍后简单地删除该元素:

class Item {
private:
  list<Item*> &l;
  list<Item*>::iterator l_iter;

public:
  Item(list<Item*> &l) : l(l) { l_iter = l.insert(l.end(), this); }

  void RemoveItself() {
    l.erase(l_iter);
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM