当前位置: 首页 > 面试题库 >

如何仅从forward_list中删除单个元素,如何有效地将其删除?

闻昊英
2023-03-14
问题内容

好吧,我认为这个问题几乎可以总结出来。我有一个独特商品的forward_list,想从中删除一个商品:

std::forward_list<T> mylist;
// fill with stuff

mylist.remove_if([](T const& value)
  {
    return value == condition;
  });

我的意思是,这种方法效果很好,但是效率不高,因为一旦找到并删除了该项目,它就会继续搜索。有更好的方法还是我需要手动进行?


问题答案:

如果你只是想删除的第一场比赛,你可以使用std::adjacent_find其次成员erase_after

#include <algorithm>
#include <cassert>
#include <forward_list>
#include <iostream>
#include <ios>
#include <iterator>

// returns an iterator before first element equal to value, or last if no such element is present
// pre-condition: before_first is incrementable and not equal to last
template<class FwdIt, class T>
FwdIt find_before(FwdIt before_first, FwdIt last, T const& value)
{
    assert(before_first != last);
    auto first = std::next(before_first);
    if (first == last) return last;
    if (*first == value) return before_first;
    return std::adjacent_find(first, last, [&](auto const&, auto const& R) { 
        return R == value; 
    });
}

int main() 
{
    auto e = std::forward_list<int>{};
    std::cout << std::boolalpha << (++e.before_begin() == end(e)) << "\n";
    std::cout << (find_before(e.before_begin(), end(e), 0) == end(e)) << "\n";

    auto s = std::forward_list<int>{ 0 };
    std::cout << (find_before(s.before_begin(), end(s), 0) == s.before_begin()) << "\n";

    auto d = std::forward_list<int>{ 0, 1 };
    std::cout << (find_before(d.before_begin(), end(d), 0) == d.before_begin()) << "\n";
    std::cout << (find_before(d.before_begin(), end(d), 1) == begin(d)) << "\n";
    std::cout << (find_before(d.before_begin(), end(d), 2) == end(d)) << "\n";

    // erase after
    auto m = std::forward_list<int>{ 1, 2, 3, 4, 1, 3, 5 };
    auto it = find_before(m.before_begin(), end(m), 3);
    if (it != end(m)) 
        m.erase_after(it);
    std::copy(begin(m), end(m), std::ostream_iterator<int>(std::cout, ","));
}

现场例子

找到匹配项后,该操作将立即停止。请注意,该adjacent_find接受一个二进制谓词,并且通过仅比较第二个参数,我们在要删除的元素之前获得了一个迭代器,因此erase_after实际上可以将其删除。复杂性就是O(N)这样,您将无法获得比它更有效的效果。



 类似资料:
  • 问题内容: 比方说: 对此: 我一直在寻找使用Mootools,jQuery甚至是(原始)JavaScript的方法,但是却不知道该怎么做。 问题答案: 使用jQuery,您可以执行以下操作: 快速链接到文档: 内容(): jQuery replaceWith( 内容 :[ 字符串 | 元素 | jQuery ]): jQuery

  • 给定下面的代码: HTML: 断续器 我必须使用此代码才能删除元素吗?它似乎太冗长了。

  • 问题内容: 我已经看过这篇文章: Python:通过删除每个第n个元素从现有列表构建新列表,但是由于某些原因,它对我不起作用: 我这样尝试: 此函数需要一个列表和。然后,它使用列表中的n步删除第n个元素,并打印结果。 这是我的函数调用: 错误的输出: 代替 然后我从上面的链接尝试了一个变体: 再次,函数调用: 给了我同样的错误的结果: 不是 如何正确地从列表中删除/删除/删除 第n个 项目? 问题

  • 问题内容: 我有一个数组例如: 谁能告诉我如何从数组中删除一个元素。例如,我要删除项目“ b”,以使数组如下所示: 我找不到解决办法。到目前为止,我在这里发现的内容不适用于我:( 问题答案: 您不能从数组中删除元素。Java数组的大小是在分配数组时确定的,不能更改。您能做的最好的事情是: 在相关位置分配给数组;例如 这给您带来了处理值所在数组中的“孔”的问题。(在某些情况下,这不是问题……但是在大

  • 问题内容: 我正在使用Python的库编写基于GUI的程序。我遇到了一个问题:我需要删除 所有 子元素(而不删除父元素,在我的情况下是)。 我的代码: 我该如何实现? 问题答案: 您可以用来获取特定小部件的所有子级的列表,然后可以对其进行遍历:

  • 问题内容: 我正在构建一个应用程序,其中我从服务器请求一个PHP文件。此PHP文件返回一个以JSONObjects为元素的JSONArray,例如, 我的代码: 如何从此JSONArray删除特定元素? 问题答案: 试试这个代码 编辑: 使用将添加到键和值。所以,用自己

  • 问题内容: 我有ArrayList,我要从中删除具有特定值的元素… 例如 我知道我们可以遍历arraylist和.remove()方法来删除元素,但是我不知道如何在迭代时做到这一点。如何删除具有“ acbd”值的元素,即第二个元素? 问题答案: 在您的情况下,无需遍历列表,因为您知道要删除哪个对象。您有几种选择。首先,您可以按索引删除对象(因此,如果您知道,该对象是第二个列表元素): 然后,您可以

  • 问题内容: 我一直在尝试最后一小时删除元素,但没有成功。而且该元素只能通过类名来访问。我试过了: 我收到未定义parentNode的错误。 那么,使用Selenium删除元素的最佳方法是什么? 问题答案: getElementByClassName不是的方法。您将要使用 但前提是您确定它是该课程中唯一的课程。