首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::prev和std::next for std::list的有效性

std::prev和std::next for std::list的有效性
EN

Stack Overflow用户
提问于 2016-06-02 06:51:54
回答 1查看 3.1K关注 0票数 2

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

代码语言:javascript
运行
复制
list<int> l;
l.push_back(21); l.push_back(1); l.push_back(31); l.push_back(41);

auto it = l.find(21);

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

代码语言:javascript
运行
复制
auto prev = std::prev(it);
auto next = std::next(it);
*prev = *prev + *next;
l.erase(it);

如你所见,我需要确保所有的边界条件。如果:std::prev()std::next()返回哪些值:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-02 07:00:50

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

它们返回nth ( n默认为1)迭代器it的前身或后继。请看这里的[iterator.operations] /6和/7。

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

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

在将it用作prev()next()的参数之前,需要确定它的有效性。std::prev()std::next()没有理由确定迭代器的减少或增量是否会使迭代器超出容器的界限。

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

代码语言:javascript
运行
复制
// 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...
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37584646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档