我将迭代器存储到列表中:
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
本身在某一时刻变得无效?发布于 2016-06-02 07:00:50
std::prev()
和std::next()
返回什么值..。
它们返回n
th ( 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()
)。
// 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...
}
https://stackoverflow.com/questions/37584646
复制相似问题