std :: list

时间:2016-06-02 06:51:55

标签: c++ c++11 iterator stdlist

我将迭代器存储到列表中:

list<int> l;
l.push_back(21); l.push_back(1); l.push_back(31); l.push_back(41);

auto it = l.find(21);

在我的算法中,每当我删除一个节点时,我都需要添加相邻的元素。像这样:

auto prev = std::prev(it);
auto next = std::next(it);
*prev = *prev + *next;
l.erase(it);

如您所见,我需要确保所有边界条件。如果符合std::prev()std::next()会返回什么值:

  • 他们是第一个也是最后一个元素;
  • it本身在某些时候变得无效?

1 个答案:

答案 0 :(得分:5)

  

std::prev()std::next()会返回什么值......

它们将n(其中n默认为1)返回迭代器it的前任或后继者。请参阅此处查看[iterator.operations] / 6和/ 7。

  

......如果它们是第一个和最后一个元素;或者如果it本身在某些时候变得无效?

迭代器在调用之前需要有效。如果it是相应的边界迭代器之一,则返回值将是无效的迭代器;即it == begin()prev(it)it == end()next(it)

it的有效性需要先确定才能用作prev()next()的参数。 std::prev()std::next()没有确定迭代器减量或增量是否会将迭代器置于容器边界之外的原因。

因此,听起来你需要在算法的擦除部分中编码两个边界条件;首先是it == l.begin(),第二个是it == prev(l.end()),如果找不到元素,则可能是第三个(因此it == l.end())。

// only proceed it something is found...
if (it != l.end()) {
  if (it == l.begin()) {
    // nothing to do...? element removed is the first one
  }
  else if (it == std::prev(l.end()) {
    // nothing? element removed is the last one....
  }
  else {
    auto prev = std::prev(it);
    auto next = std::next(it);
    *prev = *prev + *next;
  }
  l.erase(it); // remove the found element...
}