当前位置: 首页 > 知识库问答 >
问题:

如果删除std::vector上的额外元素,是否删除?

须新
2023-03-14

我使用std::erase_if使用捕获的计数器从容器中删除一半元素,如下所示。用gcc10编译的C 20

#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>

int main()
{
    {
        std::vector<int> container(10);
        std::cout << container.size() << std::endl;
        std::erase_if(container, [i = 0u](auto&&...) mutable { return i++ % 2 == 0; });
        std::cout << container.size() << std::endl;
    }
    std::cout << std::endl;
    {
        std::map<int, int> container;
        for (int i = 0; i < 10; i++) {
            container.emplace(i, i);
        }
        std::cout << container.size() << std::endl;
        std::erase_if(container, [i = 0u](auto&&...) mutable { return i++ % 2 == 0; });
        std::cout << container.size() << std::endl;
    }
    std::cout << std::endl;
    {
        std::unordered_map<int, int> container;
        for (int i = 0; i < 10; i++) {
            container.emplace(i, i);
        }
        std::cout << container.size() << std::endl;
        std::erase_if(container, [i = 0u](auto&&...) mutable { return i++ % 2 == 0; });
        std::cout << container.size() << std::endl;
    }
}

输出出乎意料。对于向量,删除了一个额外的元素:

10
4

10
5

10
5

我打印出结果,看起来vector[1]是意外删除的元素

虽然这通常不是erase_if的正常用法,但我仍然很好奇为什么它只发生在向量上,而不发生在其他贴图上。我猜这和迭代器类型shenanigan有关。如果有人能详细解释,我将不胜感激。

共有1个答案

狄承望
2023-03-14

remove_if需要谓词。标准库要求谓词类型:

给定一个类型为(可能为常数)T的glvalueu,指定与*first相同的对象,pred(u)应是一个有效表达式,它等于pred(*first)

谓词会更改其内部状态。因此,使用同一个元素调用它两次将产生不同的结果。这意味着它不满足谓词的要求。

因此,未定义的行为随之而来。

 类似资料:
  • 我已经使用了一段时间,但我遇到了一个错误,其中JSoup自动删除"表"元素,找不到任何解决方案... 如果你导航到这段代码中的链接,你可以看到有多个元素“表”(例如:在“Saison 01(VF)”下,有22个包含“Episode x”的表元素),但是它们在JSOUP输出中不存在... 我试图用一个简单的获取文档,打印它(表元素在那里),用Jsoup解析它,重新打印(表元素不见了),所以我知道这不

  • 要从复杂对象中删除某些字段。 我想删除'阴谋'

  • 问题内容: 如果删除了DOM元素,它的侦听器也会从内存中删除吗? 问题答案: 现代浏览器 纯JavaScript 如果删除的DOM元素是无引用的(没有指向它的引用),则是垃圾收集器以及与之关联的任何事件处理程序/侦听器都会拾取该元素本身。 然而; 如果仍然有引用指向该元素,则该元素及其事件侦听器将保留在内存中。 jQuery 假设jQuery中的相关方法(例如)将以完全相同的方式起作用(考虑是使用

  • 问题内容: 我想从JSON中删除JSON元素或整行。 我有以下JSON字符串: 问题答案: 您可以使用splice从数组中删除元素。

  • 主要内容:删除元素/内容,jQuery remove() 方法,实例,jQuery empty() 方法,实例,过滤被删除的元素,实例通过 jQuery,可以很容易地删除已有的 HTML 元素。 删除元素/内容 如需删除元素和内容,一般可使用以下两个 jQuery 方法: remove() - 删除被选元素(及其子元素) empty() - 从被选元素中删除子元素 jQuery remove() 方法 jQuery remove() 方法删除被选元素及其子元素。 实例 $("#div1").re

  • 主要内容:JavaTuples 删除元素的方法,JavaTuples 删除元素的示例JavaTuples 删除元素的方法 元组包含 removeAtX() 方法来删​​除特定索引处的值。例如 Triplet 类具有以下方法。 removeAt0() : 删除索引 0 处的值并返回结果元组。 removeAt1() : 删除索引 1 处的值并返回结果元组。 removeAt2() : 删除索引 2 处的值并返回结果元组。 删除一个元素会返回一个新的元组。 JavaTuples 删除