C++ 使用反向迭代器擦除最后一个元素
最近,我在维护的代码中发现了以下内容:C++ 使用反向迭代器擦除最后一个元素,c++,std,reverse-iterator,C++,Std,Reverse Iterator,最近,我在维护的代码中发现了以下内容: for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) { another_container->push_back(*rit); base_container::erase((++rit).base()); } for(反向迭代器rit=base\u container::r
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
base_container::erase((++rit).base());
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
base_容器::擦除(++rit.base());
}
它尝试使用反向迭代器从循环中的容器(本例中为std::list)中删除最后一个元素。关键是它看起来应该能正常工作,但却不能正常工作(一些内存损坏是由于无效的迭代器造成的),我想知道为什么?是否有任何限制或规定不这样做
谢谢
另外,为了防止对解决方案进行任何改进,我已经重新编写了解决方案,使其能够工作。问题是为什么上面的代码不能正常工作?调用
erase
后的所有迭代器都无效。但是,erase
返回您可以使用的迭代器。调用erase
后的所有迭代器都无效。但是,erase
返回您可以使用的迭代器。调用erase
后的所有迭代器都无效。但是,erase
返回您可以使用的迭代器。调用erase
后的所有迭代器都无效。然而,erase
返回您可以使用的迭代器。rit
由erase
调用无效。rit
由erase
调用无效。rit
由erase
调用无效。rit
由erase
调用无效。需要保存erase()
的返回值,并将其转换回reverse\u iterator
,以避免迭代器失效
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
rit(it);//converting iterator to reverse_iterator.
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
auto it=base_container::erase(++rit).base();//erase将返回一个iteraotor
rit(it);//将迭代器转换为反向迭代器。
}
您需要保存erase()
的返回值,并将其转换回反向迭代器
,以避免迭代器失效
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
rit(it);//converting iterator to reverse_iterator.
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
auto it=base_container::erase(++rit).base();//erase将返回一个iteraotor
rit(it);//将迭代器转换为反向迭代器。
}
您需要保存erase()
的返回值,并将其转换回反向迭代器
,以避免迭代器失效
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
rit(it);//converting iterator to reverse_iterator.
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
auto it=base_container::erase(++rit).base();//erase将返回一个iteraotor
rit(it);//将迭代器转换为反向迭代器。
}
您需要保存erase()
的返回值,并将其转换回反向迭代器
,以避免迭代器失效
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
rit(it);//converting iterator to reverse_iterator.
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
auto it=base_container::erase(++rit).base();//erase将返回一个iteraotor
rit(it);//将迭代器转换为反向迭代器。
}
不是你问题的答案,但为什么这么复杂?你不能先把整个容器倒过来复制一下,然后再把原来的那一个清除掉吗?还有,什么是基本容器?std::list正如我在上面写的那样,您从容器继承了吗-(基本容器只是std:list@Rom098:很抱歉,我的错误没有回答您的问题,但为什么这么复杂?您不能先反向复制整个容器,然后清除原始容器吗?还有,什么是基本容器?std::列表正如我上面写的,您是否继承容器作为base\u容器::
建议?:-(基本容器只是std:list@Rom098:很抱歉,我的错误没有回答您的问题,但为什么这么复杂?您不能先反向复制整个容器,然后清除原始容器吗?还有,什么是基本容器?std::列表正如我上面写的,您是否继承容器作为base\u容器::
建议?:-(基本容器只是std:list@Rom098:很抱歉,我的错误没有回答您的问题,但为什么这么复杂?您不能先反向复制整个容器,然后清除原始容器吗?还有,什么是基本容器?std::列表正如我上面写的,您是否继承容器作为base\u容器::
建议?:-(基本容器只是std:list@Rom098:抱歉,我的错误不是所有的迭代器。但肯定是指向已擦除元素的迭代器。不是所有的迭代器。但肯定是指向已擦除元素的迭代器。不是所有的迭代器。但肯定是指向已擦除元素的迭代器。不是所有的迭代器。但肯定是迭代器或者指向已擦除的元素。