如何在std :: forward_list中移动或删除特定元素?

时间:2017-12-04 02:36:25

标签: c++ forward-list

我一直试图解决这个问题超过一个小时。我需要从列表中间移动一个整数到开头。没有移动整数的选项,如果我可以在开头插入一个并从中间删除旧的那个就没关系,但你也做不到。 (您可以删除特定整数的每个条目,而不是单个一个)

我在cplusplus.com上阅读了关于std :: forward_list的所有内容,并用Google搜索了15分钟,没有结果。

3 个答案:

答案 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.删除中间元素。 如果您正在使用某些限制您的列表库,请创建自己的列表,以便从任何索引中删除。