我正在尝试在不使用 resize() 方法的情况下调整转发列表的大小



我想尝试反转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;
}

相关内容

最新更新