gpt4 book ai didi

c++ - 如何移动或删除 std::forward_list 中的特定元素?

转载 作者:行者123 更新时间:2023-12-05 07:38:47 27 4
gpt4 key购买 nike

一个多小时以来,我一直在努力解决这个问题。我需要将一个整数从列表的中间移到开头。没有移动整数的选项,如果我可以在开头插入一个并从中间删除旧的,那会很好,但你也不能这样做。 (您可以删除特定整数的每个条目,而不是单个)

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

最佳答案

结合这三点来删除 forward_list 中的给定元素(给定位置):

  • 使用 erase_after 删除 a 位置之后的一个(或范围)。

  • 使用两个迭代器,previt,其中prev保持前一个位置,it保持实际位置。

  • 使用before_begin 初始化prev 并使用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和it从同一个点开始:(forward_list.begin()) ,可以单独检查第一个元素,然后使用 pop_front 删除它。

您可以使用 remove、remove_if 从您的 forward_list 中删除所有元素(remove:比较等于 val,remove_if:which Predicate pred 返回 true)。

关于c++ - 如何移动或删除 std::forward_list 中的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com