std :: prev和std :: next对std :: list的有效性

Ram*_*Ram 2 c++ iterator stdlist c++11

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

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

auto it = l.find(21);
Run Code Online (Sandbox Code Playgroud)

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

auto prev = std::prev(it);
auto next = std::next(it);
*prev = *prev + *next;
l.erase(it);
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要确保所有边界条件.在以下情况下,做什么std::prev()std::next()返回什

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

Nia*_*all 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...
}
Run Code Online (Sandbox Code Playgroud)