我一直试图解决这个问题超过一个小时。我需要从列表中间移动一个整数到开头。没有移动整数的选项,如果我可以在开头插入一个并从中间删除旧的那个就没关系,但你也做不到。 (您可以删除特定整数的每个条目,而不是单个一个)
我在cplusplus.com上阅读了关于std :: forward_list的所有内容,并用Google搜索了15分钟,没有结果。
答案 0 :(得分:0)
您在这里!
// Example program
#include <iostream>
#include <string>
#include <forward_list>
void EraseAtPosition(std::forward_list<int>::iterator pos, std::forward_list<int>& your_list) {
// Find the position before input pos
std::forward_list<int>::iterator prev;
for (auto it = your_list.before_begin(); it != your_list.end();) {
prev = it;
if (++it == pos) {
break;
}
}
// Erase out of list
your_list.erase_after(prev);
}
int main()
{
std::forward_list<int> l = {1, 2, 3, 5};
std::forward_list<int>::iterator target = l.begin();
EraseAtPosition(target, l);
for (auto it = l.begin(); it != l.end(); ++it) {
std::cout << *it << "\n";
}
return 0;
}
答案 1 :(得分:0)
将这三个点结合起来以擦除forward_list中的给定元素(给定位置):
使用 erase_after 删除a位置之后的一个(或范围)。
使用两个迭代器,分别为上一个和它,其中上一个保留前一个位置并它保持实际位置。
使用 before_begin 初始化上一步,并开始初始化它。能够删除匹配的第一个位置,这一点非常重要。
std::forward_list<int> mylist = {10, 10, 20, 30, 40, 10, 50, 10, 60};
int skey = 10;
for (int & val : mylist) std::cout<<val<<", ";
auto prev = mylist.before_begin();
for (auto it = mylist.begin(); it!=mylist.end(); ++it)
{
if(*it==skey) // or if(it== input_it_pos) for a known position
{
mylist.erase_after(prev);
break;
}
prev=it;
}
std::cout<<"\n after deletion : "<<std::endl;
for (int & val : mylist) std::cout<<val<<", ";
注释1 :您可以按以下方式更改代码以删除所有匹配的元素:
auto prev = mylist.before_begin();
for (auto it = mylist.begin(); it!=mylist.end(); )
{
if(*it==skey)
{
it = mylist.erase_after(prev);
// break; // Comment or uncomment to deal with only the first or all the found element(s).
}
else
{
prev = it;
++it;
}
}
注释2 :如果您不使用before_begin,并且两个prev和它从同一点开始:(forward_list.begin()),则可以单独检查第一个元素,然后检查使用 pop_front 删除它。
您可以使用remove,remove_if来删除您的forward_list中的所有元素(remove:比较值等于val,remove_if:哪个谓词pred返回true)。
答案 2 :(得分:-2)
您可以使用Dobly Link列表。 (我希望简单的链接列表也能完成你的任务) 这是双链表的链接。 https://www.hackerearth.com/practice/notes/doubly-linked-list-data-structure-in-c/ 跟着这些步骤: 1.复制中间元素。 2.将复制的元素添加到列表的开头。 3.删除中间元素。 如果您正在使用某些限制您的列表库,请创建自己的列表,以便从任何索引中删除。