我想尝试反转forward_list(没有reverse()方法),但我不知道如何摆脱erase_after()方法后的最后一个元素,而不使用resize()。
#include<forward_list>
template<typename vt>
class reverse_forward_list{
public:
static void reverse(std::forward_list<vt>& list){
typename std::forward_list<vt>::iterator iter = list.begin();
int x = 0;
for(vt& i :list){
list.emplace_front(i);
x++;
}
list.erase_after(iter,list.end());
//list.resize(x);
}
};
感谢您的帮助
使用list.before_begin()
来擦除前面的第一个元素。
此外,这可以通过将每个节点拼接到列表的前面来更有效地实现(这可能是reverse
内部工作的方式,并且您不必分配新节点/构造新值)
我认为在遍历列表时操作它应该有一个很好的理由…这是一场即将发生的灾难。
相反,可以考虑使用临时列表,就像这样:template<typename vt>
static void reverse(std::forward_list<vt>& list) {
std::forward_list<vt> newlist;
while (!list.empty()) {
newlist.push_front(list.front());
list.pop_front();
}
list = newlist;
}