std::p rev 和 std::next for std::list 的有效性
Validity of std::prev and std::next for std::list
我正在将迭代器存储到列表中:
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
本身在某个时候变得无效?
std::prev()
和std::next()
返回哪些值...
它们返回迭代器it
的第n
个(其中n
默认为 1)的前置或后继。有关 [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...
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 使用"std::unordereded_map"映射到"std::list"对象
- 使用std::list创建循环链表
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 包含 std::list 的结构体的 C++ 初始化
- 在基于范围的 for 循环期间插入 std::list 的后面
- 循环挂起迭代的 std::擦除 on std::list
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- std::list 中的迭代器感知对象
- std::list 可以用于简单的无锁队列吗?
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- C++11 基于范围的 for 循环,用于 std::list
- 向 std::list 添加新元素的复杂性
- 如何使用 std::list 模板的迭代器擦除
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 如何将文件的一部分读取到std::list缓冲区?
- 抽象和派生与std::list相结合
- std::list 的两个 insert() 方法签名之间的实现差异
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?