沖田縂司 2024-02-06 17:20 采纳率: 60%
浏览 2

请问为什么被remove后不应该是把3排到最后面吗?

请问为什么被remove后不应该是把3排到最后面吗?为什么会多出来一个7和8?


vector<int> numbers = { 1, 2, 3, 4, 5, 3, 6, 7, 8, 3 };
   
        remove(numbers.begin(), numbers.end(), 3);
          
        for (auto num : numbers) {
            cout << num << " ";
        }

img

  • 写回答

5条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-06 17:21
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    std::remove函数并不是直接在原容器中删除元素,而是在保持原有元素内存顺序的前提下,将需要移除的元素移动到容器末尾,并返回新范围的有效结尾。因此,在执行remove(numbers.begin(), numbers.end(), 3);之后,所有值为3的元素会被移动到vector的末尾,但它们仍然占据着vector的空间。

    所以当你遍历整个vector时(包括那些被标记为“应被移除”的位置),你会看到这样的输出:

    1 2 4 5 6 7 8 3 3 3
    

    如果你希望移除元素后实际减少容器大小,你应该使用std::vector::erase函数与std::remove配合,如下所示:

    numbers.erase(remove(numbers.begin(), numbers.end(), 3), numbers.end());
    

    这样,erase会从原始容器中真正移除remove标记的元素,最终得到不包含值3的vector。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月6日

悬赏问题

  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题