为什么我不能使用 std::remove_if 从 std::set 中删除字符串? [复制]

2023-11-27

可能的重复:
remove_if 相当于 std::map

我有一组字符串:

set <wstring> strings;
// ...

我希望根据谓词删除字符串,例如:

std::remove_if ( strings.begin(), strings.end(), []( const wstring &s ) -> bool { return s == L"matching"; });

当我尝试这样做时,我收到以下编译器错误:

c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(1840): error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::basic_string<_Elem,_Traits,_Ax>' 

该错误似乎表明std::string没有按值复制构造函数(这是非法的)。使用起来有什么不好吗std::remove_if with std::set?我是否应该做其他事情,例如多次迭代set::find()其次是set::erase() ?


std::remove_if (or std::erase) 通过重新分配范围成员的值来工作。它不明白如何std::set组织数据,或者如何从其内部树数据结构中删除节点。事实上,如果没有set对象本身。

标准算法被设计为具有透明的(或至少始终易于记住的)计算复杂性。有选择地从数组中删除元素的函数set由于需要重新平衡树,这将是 O(N log N),这并不比循环调用好my_set.remove()。所以,标准没有提供它,而这正是你需要编写的。

另一方面,一个天真的手工编码循环从vector一对一的时间复杂度为 O(N^2),而std::remove_if是 O(N)。因此,在这种情况下,图书馆确实提供了切实的好处。

一个典型的循环(C++03风格):

for ( set_t::iterator i = my_set.begin(); i != my_set.end(); ) {
    if ( condition ) {
        my_set.erase( i ++ ); // strict C++03
        // i = my_set.erase( i ); // more modern, typically accepted as C++03
    } else {
        ++ i; // do not include ++ i inside for ( )
    }
}

编辑(4年后!):i ++那里看起来很可疑。如果什么erase使无效i后置自增运算符可以更新之前吗?不过,这很好,因为它是一个超载的operator++而不是内置运算符。该功能安全更新i就地和then返回其原始值的副本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能使用 std::remove_if 从 std::set 中删除字符串? [复制] 的相关文章

随机推荐

  • 如何在 Liferay portlet 中设置 Cookie?

    我在尝试设置会话 cookie 时遇到问题Liferay 6 0 portlet 我希望能够向客户端浏览器设置一个 cookie 以存储用于 linkedin 身份验证的应用程序密钥 然后其他 portlet 可以在其中检索它 我可以使用以
  • 如何在 ReadTheDocs 导航栏中链接生成的索引页面?

    我正在 ReadTheDocs 上使用 Sphinx 主题创建我的文档 构建过程会生成一个 genindex html 文件 可以通过以下方式引用该文件 Link to the ref genindex page 这会创建 链接到Index
  • 了解 Dagger 2 中的范围

    我在 Dagger 2 中遇到了与范围相关的错误 我正在尝试了解如何解决它 我有一个CompaniesActivity这表明公司 当用户选择一个项目时 所选公司的员工会显示在EmployeesActivity 当用户选择一名员工时 她的详细
  • 如何在 yii2 模态窗口中使用 pjax 更新小部件

    我的模态窗口中有两个 ActiveForm 提交第一个表单后 我需要更新第二个表单并保持模态 据我了解 pjax 可以处理这个问题 但无法让它正常工作 在 form php 中 我有 ActiveForm 和应该更新的小部件 need to
  • 使用 PdfMiner 和 PyPDF2 合并列提取文本

    我正在尝试使用 pdfMiner 解析 pdf 文件文本 但提取的文本被合并 我正在使用以下链接中的 pdf 文件 编辑 链接已损坏 指向潜在的恶意软件 我擅长任何类型的输出 文件 字符串 这是为我返回提取的文本作为字符串的代码 但由于某种
  • 合并两个 jQuery 对象

    我喜欢有一个或多个 jQuery 对象的返回值 以将它们添加到 var f function var a div class a div do someting awesome return a 带有两个 s 的正确示例 var f fun
  • Rails:有没有办法告诉请求的来源?

    谷歌分析告诉我流量的来源是什么 搜索引擎 Facebook 等 有没有办法从每个请求获取此信息request对象或其他 我将不胜感激任何帮助 request referrer会给你HTTP 引荐来源网址 value
  • Azure Web应用程序:堆栈设置

    I can set my stack for a webapp through the portal 我通过 ARM 模板部署基础设施 apiVersion 2015 08 01 type Microsoft Web sites name
  • 如何清除表单中所有文本框的文本?

    private void CleanForm foreach var c in this Controls if c is TextBox TextBox c Text String Empty 上面这个方法不起作用 控件没有被清除 它编译
  • .Net WebDAV 服务器

    我正在寻找在 ASP Net 中实现 WebDAV 服务器 该应用程序将部署到 IIS 6 我见过一些提供此功能的框架 但我似乎无法确定它们如何在不 显然 修改 IIS 设置的情况下完成此功能 我的具体问题是如何配置 IIS 和 ASP N
  • 设置土耳其语文本转语音[重复]

    这个问题在这里已经有答案了 我正在开发文本到语音应用程序 我想将土耳其语设置为这样 tts setLanguage Locale TR 但这在android中不可用 这种添加方式是错误的还是有不同的方法将土耳其语添加到文本到语音中 任何帮助
  • 如何在多项目 Android 构建中排除重复的 C 共享库 (.so)?

    当使用两个库模块构建父项目时 我遇到 重复文件 冲突 这两个模块使用相同的库模块libc shared so共享库 NOTE 请不要认为这是一个 重复的问题 我读过几篇相关的文章 它们帮助我走到了这一步 但是 没有帖子提供适用于我的案例的答
  • 多处理写入 pandas 数据框

    所以我试图用下面的代码做的是读取列表列表并将它们放入名为的函数中checker然后有log result处理函数的结果checker 我尝试使用多线程来执行此操作 因为变量名称rows to parse实际上有数百万行 因此使用多个内核应该
  • 为自定义类实现 hashcode 和 equals

    所以我有许多自定义类 其中也有使用组合的自定义类 我的自定义类具有经常更改的变量 我将它们添加到 HashSets 中 所以我的问题是当我实现 hashCode 时 对于只有不断变化的私有字段的类 我该怎么办 以下是一个自定义类的示例 pu
  • Html Agility Pack - 删除元素,但不删除innerHtml

    我可以通过 note Remove 轻松删除该元素 如下所示 HtmlDocument html new HtmlDocument html Load Server MapPath Site themes default index csh
  • Laravel 急切加载有限制

    我有两个表 即 users 和 users actions 其中 users actions 与用户有 hasMany 关系 users id name surname email actions id id action id user
  • 等待页面加载 - Cypress

    我遇到问题 因为页面未完全加载 我尝试过cy wait 1000 方法 我确实认为这不是一个好的解决方案 但仍然不起作用 页面未完全加载 这是我要测试的网站https www 24mx ie 这 代码在文件中homePage js clas
  • 如何关闭 gcc 编译器优化以启用缓冲区溢出

    我正在研究一个作业问题这需要禁用编译器优化保护才能工作 我在 ubuntu linux 上使用 gcc 4 4 1 但无法弄清楚哪些标志是正确的 我意识到它依赖于架构 我的机器运行 32 位 Intel 处理器 Thanks 这是个好问题
  • 如何使用 SQL 计算树中值的总和

    我需要对用户树所获得的每个级别的积分进行求和 1级是该用户以下1级的用户积分总和 2级是低于用户2级的用户的1级积分 以此类推 计算在非生产服务器上每月进行一次 无需担心性能 执行此操作的 SQL 会是什么样子 如果你感到困惑 别担心 我也
  • 为什么我不能使用 std::remove_if 从 std::set 中删除字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 remove if 相当于 std map 我有一组字符串 set