为什么下面的代码会崩溃?当我通过反向迭代器进行迭代时应该做什么。那么如何删除单个元素呢?
deque q;
q.push_back(4);
q.push_back(41);
q.push_back(14);
for (auto it = q.begin(); it != q.end();) {
auto current = it;
q.erase(current);
it++;
}
- 为什么下面的代码会崩溃?那么我该如何删除单个元素呢?
std::deque::erase使迭代器无效。
所有迭代器和引用都无效,除非被擦除的元素位于容器的末尾或开头,在这种情况下,只有迭代器和对被擦除元素的引用无效。
尾后迭代器也会失效,除非被擦除的元素位于容器的开头并且最后一个元素未被擦除。
在您的代码中,要删除的元素的迭代器(即it
and current
) 后将失效q.erase(current)
, then it++
将通向UB。
您可以利用的返回值std::deque::erase
跟随最后删除的元素的迭代器。如果迭代器 pos 引用最后一个元素,则end()
返回迭代器。
for (auto it = q.begin(); it!=q.end(); )
{
it = q.erase(it);
}
- 如果我通过反向迭代器进行迭代,我该怎么办。
Because std::deque::erase
不接受reverse_iterator
作为参数,您需要使用base()将其转换为普通迭代器(注意位置转换)。例如
for (auto it = q.rbegin(); it!=q.rend(); )
{
it = std::make_reverse_iterator(q.erase((++it).base()));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)