首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在保留原始顺序的同时擦除/删除多个std :: vector元素的最有效方法?

在保留原始顺序的同时擦除/删除多个std::vector元素的最有效方法是使用erase-remove惯用法。该方法结合了erase和remove两个函数,可以高效地删除指定元素。

具体步骤如下:

  1. 首先,使用std::remove函数将要删除的元素移动到vector的末尾,并返回一个迭代器指向新的逻辑末尾。
  2. 然后,使用vector的erase函数删除从新的逻辑末尾到原始末尾的所有元素。

以下是示例代码:

代码语言:cpp
复制
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 要删除的元素
    std::vector<int> toRemove = {2, 4, 6, 8};

    // 使用erase-remove惯用法删除元素
    vec.erase(std::remove_if(vec.begin(), vec.end(), [&](int i) {
        return std::find(toRemove.begin(), toRemove.end(), i) != toRemove.end();
    }), vec.end());

    // 输出结果
    for (const auto& num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

该方法的优势在于只需遍历vector一次,且保持了原始顺序。适用场景包括需要删除多个元素且保持原始顺序的情况,例如从一个包含大量数据的vector中删除指定元素。

推荐的腾讯云相关产品:腾讯云对象存储(COS)

产品介绍链接地址:https://cloud.tencent.com/product/cos

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Example】C++ 标准库常用容器全面概述

pop_back 删除vector末尾处元素。 push_back vector末尾处追加一个元素。 rbegin 返回起始位置反向迭代器。 rend 返回末尾位置反向迭代器。...某个元素后插入新元素 emplace_after 元素后原位构造元素 erase_after 擦除元素元素 std::deque 双端队列,是具有下标与逻辑相邻顺序容器。...引发失效情况: 名称 情况 头尾插入 可能导致迭代器失效(全部或部分),但指针与引用仍然有效 头尾删除 其他元素迭代器不失效 中间插入或删除操作 全部失效 具体原因: std::deque...Set std::set 与 std::multiset 显著特点就是键就是值,所以 Set 当中值不能直接修改,需要删除旧值再重新建立新值 (即新建立键值,只是对于 set 来说值就是键而已)...序列由哈希函数弱排序,哈希函数将此序列分区到称为存储桶有序序列集中。 每个存储桶中,比较函数确定任何一对元素是否具有等效排序。 每个元素同时用作排序键和值。

3.2K30

动态数组和C++ std::vector详解

std::vector是封装动态数组顺序容器,且该容器中元素存取是连续vector存储是自动管理,不需要人为操作自动实现按需扩张收缩。...2.2.2 元素访问 at at用于访问指定元素同时进行越界检查,该函数返回位于指定位置pos元素引用,如果pos不在容器范围内,则抛出std::out_of_range异常。...如果new_cap大于当前vectorcapacity(),那么就会重新分配新存储,否则该方法不做任何事情。 注: reserve() 不会更改 vector 大小。...c.end()); c.erase(it, c.end()); return r; std::erase_if (std::vector)从容器中擦除所有满足 pred 元素,其返回值为被擦除元素个数...插入元素擦除元素效率 末尾插入元素效率最快,但插入任意位置可能会很慢,因为中间可能涉及到元素复制和移动。擦除元素同理。

47310

C++ Vector

c++ vector 简介 vector顺序容器一种,vector 是可变长动态数组(可存放任意类型),支持随机访问迭代器。...- 中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费时间和容器中元素个数成正比 函数列表 Constructors 构造函数 Operators 对vector元素赋值或比较...内存分配器.STL里面一般不会new或者alloc来分配内存,而是通过一个allocator对象相关方法来分配 - 案例 ```c vector3(3, 1, v2.get_allocator...n个类型为T对象,p必须是一个先前由allocate返回指针,且n必须是p创建时所要求大小,且调用该函数之前必须销毁在这片内存上创建对象,这是因为创建过程中我们分配原始内存,所以释放内存时候也只能严格释放这片原始内存...// p为T*类型指针,用于对p指向对象执行析构函数 #### 详解 - allocate用于分配原始内存 - 正如前面说到,allocate出来内存是原始,未构造内存.

1.9K97

疯子算法总结(二) STL Ⅰ 算法 ( algorithm )

什么是STL(STl内容): 容器(Container): 是一种数据结构,如list,vector,和deques ,以模板类方法提供。...为了访问容器中数据,可以使用由容器类输出迭代器; 迭代器(Iterator): 提供了访问容器中对象方法。例如,可以使用一对迭代器指定list或vector一定范围对象。...stable_partition: 与partition类似,不过不保证保留容器中相对顺序。...删除和替换算法(15个) copy: 复制序列 copy_backward: 与copy相同,不过元素是以相反顺序被拷贝。...push_heap: 假设first到last-1是一个有效堆,要被加入到堆元素存放在位置last-1,重新生成堆。指向该函数前,必须先把元素插入容器后。重载版本使用指定比较操作。

46840

C++系列笔记(九)

STL顺序容器包括: std::vector——操作与动态数组一样,最后插入数据;可将vector视为书架,您可在一端添加和拿走图书; std::deque——与std::vector类似,但允许开头插入或删除元素...std::stack:以 LIFO(后进先出)方式存储元素,让您能够栈顶插入(压入)和删除(弹出)元素std::queue:以FIFO(先进先出)方式存储元素,让您能够删除最先插入元素。...std::priority_queue:以特定顺序存储元素,因为优先级最高元素总是位于队列开头。 STL算法 最常见算法如下: std::find:集合中查找值。...std::find_if:根据用户指定谓词集合中查找值。 std::reverse:反转集合中元素排列顺序std::remove_if:根据用户定义谓词将元素从集合中删除。...要在末尾插入,可使用成员方法push_back。 list中间插入元素 std::list特点之一是,在其中间插入元素所需时间是固定,这项工作是由成员函数insert完成

1K20

学了C++不会STL,简直少了左膀右臂

false p>=p1 p位置p1后面或同一位置时返回true,否则返回false 只有顺序容器和关联容器支持迭代器遍历,各容器支持迭代器类别如下: 容器 支持迭代器类别 说明 vector...multimap 双向 一种包含成对数值容器,一个值是实际数据值,另一个是用来寻找数据关键字。一个关键字可以与多个数据元素关联。...第一个不合法地址(即末地址+1),cmp)//cmp可以缺省 bool cmp()//可以用到结构体上 { return (); } stable_sort: 与sort类似,不过保留相等元素之间顺序关系...stable_partition: 与partition类似,不过不保证保留容器中相对顺序。...push_heap: 假设first到last-1是一个有效堆,要被加入到堆元素存放在位置last-1,重新生成堆。指向该函数前,必须先把元素插入容器后。重载版本使用指定比较操作。

77620

C++初阶学习第九弹——探索STL奥秘(四)——vector深层挖掘和模拟实现

_finish; //指向有效数据尾 T* _endOfStorage; //指向容量尾 }; } 因为vector本质上与顺序表很相似,只是存储数据上变更加多元化了,所以我们可以对基本成员做一些调整...五大步骤: 1、构造和销毁 2、迭代器相关 3、容量相关 4、元素访问 5、vector修改操作 二、 vector逐步实现 1、构造和销毁 构造方法主要有以下五种: · 默认构造...m = T())类型来避免错误发生 //这种情况下参数一定都为int型,所以我们可以按顺序方式来写这个函数 vector(int n, const T& m = T()) :_start...修改操作 vector修改操作关键就是insert函数和erase函数,就是在任意位置插入和删除,尾插尾删可以直接调用这两个函数来实现,但这两个函数细节也挺多,具体实现细节看下面实现过程...// 方便解决:一边遍历一边删除迭代器失效问题 // (迭代器失效问题在vector中会发生,不知道可以看我之前文章) iterator erase(iterator pos) { // 挪动数据进行删除

6210

删除有序数组中重复项

() 算法可以序列中原地移除重复元素,返回尾后迭代器 auto it = unique(nums.begin(), nums.end()); // 按题目要求,返回删除后数组新长度即可...= 0) 错误提示是stl_vector.h文件中,发生了对空指针非零偏移操作。问题在于你创建vector a没有初始化,它大小是0,因此不能通过索引访问其中元素。...遍历nums数组时,如果当前元素unordered_set中不存在,就将它添加到unordered_set和b数组中,同时更新计数count。...负数索引C++中是无效,会导致未定义行为。 为了正确地处理负数和保持原始顺序,我们可以使用另外一个数组来存储不重复元素,并在遍历uniqueSet时按顺序元素存储到这个数组中。...然后,我们再将uniqueArr中内容复制回nums数组,并返回不重复元素个数。 现在代码应该能够正确地移除重复元素,并将不重复元素原始顺序放回nums数组中。函数返回是不重复元素个数。

12810

单向链表和C++ std::forward_list详解

std::forward_list插入、删除和移动操作(例如排序)中比其他容器更有用,并且允许时间常数内插入和删除元素。...std::forward_list与std::list不同是:std::forward_list仅跟踪下一个元素位置,而std::list同时跟踪下一个和上一个元素,从而增加了存储每个元素所需存储空间...不在单独元素上调用任何移动、复制或交换操作。所有迭代器和引用保持有效操作后,未指明保有此容器中 end() 值迭代器指代此容器还是另一容器。...注:对于两个链表中等价元素,来自 *this 元素始终来自 other 元素之前,并且 *this 和 other 等价元素顺序不更改。如果 get_allocator() !...由于每个节点指针更多,插入和删除元素开销更大,因此性能较差。 正向顺序访问 正向和反向顺序访问 比list更有效。 效率低于forward_list表。

37310

STL 总结与常见面试题

关联式容器是非线性树结构,更准确说是二叉树结构。各元素之间没有严格物理上顺序关系,也就是说元素容器中并没有保存元素置入容器时逻辑顺序。...list双向链表,是序列容器,允许序列中任何地方进行常数时间插入和擦除操作,并在两个方向上进行迭代,可以高效地进行插入删除元素。...普通版本输入序列自身内部重拍元素,_copy 版本完成重拍后写入到指定目的序列中,而不改变输入序列 remove(beg, end, val); // 通过用保留元素覆盖要删除元素实现删除 ==val...- start); vector中erase方法与algorithn中remove方法区别 vector中erase方法真正删除元素,迭代器不能访问了 remove只是简单地将元素移到了容器最后面...erase方法会返回下一个有效迭代器,所以当我们要删除某个元素时,需要it=vec.erase(it);。

87430

JAVA常见容器_JAVA比较容器

Iterator是Java迭代器简单实现,为List设计ListIterator具有更多功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。   ...从性能观点来看,应该小心使用这些方法很多实现中,它们将执行高开销线性搜索。 List 接口提供了两种列表任意位置高效插入和移除多个元素方法。...List子类 List流行实现类有Vector、ArrayList、LinkedList。三者区别将在下文提及。...1.2)Vector (类) Vector与ArrayList一样,也是通过数组实现,不同是它支持线程同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起不一致性,但实现同步需要很高花费...——因为Set这个制约,使用Set集合时候,应该注意两点: 为Set集合里元素实现类实现一个有效equals(Object)方法; 对Set构造函数,传入Collection参数不能包含重复元素

67420

C++常见避坑指南

; 迭代器删除 处理缓存时,容器元素增删查改是很常见,通过迭代器去删除容器(vector/map/set/unordered_map/list)元素也是常有的,但这其中使用不当也会存在很多坑。...来擦除从新末尾位置开始元素。...addressof(_My_data)); } 此外,STL容器删除也要小心迭代器失效,先来看个vector、list、map删除例子: // vector、list、map遍历并删除偶数元素...其实vector调用erase()方法后,当前位置到容器末尾元素所有迭代器全部失效了,以至于不能再使用。 迭代器失效问题:对容器操作影响了元素存放位置,称为迭代器失效。...也就是: 同一个shared_ptr对象被多个线程同时读是安全 同一个shared_ptr对象被多个线程同时读写是不安全 多线程代码操作不是同一个shared_ptr对象。

38510

C++ vector用法详解

因此,包含同样数量元素vector和数组相比,占用空间会更大。而且vector最后增加或者删除一个元素,消耗时间是一个常数值,与vectorsize无关。   ...返回常量迭代器第一个元素指针 cend 返回常量迭代器第一个元素指针 crbegin 返回常量迭代器逆序第一个元素指针 crend 返回常量迭代器逆序最后一个元素指针 Capacity...删除最后一个元素 insert 插入元素 erase 擦除元素 swap 交换两个容器内容 clear 将容器里内容清空,size值为0,但是存储空间没有改变 emplace 插入元素(与insert...vector中有三种可以删除元素操作,第一种就是我们上面讲到pop_back,删除最后一个元素,无返回值;第二种是clear,将容器清空,size变为0,无返回值;第三种是erase,通过迭代器来删除元素...,可以删除一个元素,也可以删除某个范围内元素,返回下一个位置迭代器。

7.1K20

【C++】探索STL中高效容器:vector

迭代器可以指向容器中一个或多个元素,并提供了访问和修改元素方式。迭代器可以容器中前进、后退、比较和解引用等。...与其它动态序列容器相比(deque, list and forward_list), vector访问元素时候更加高效,末尾添加和删除元素相对高效。对于其它不在末尾删除和插入操作,效率更低。...reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容代价缺陷问题。 resize开空间同时还会进行初始化,影响size。...使用迭代器遍历容器时,如果容器发生结构上变化,例如元素插入、删除操作,那么迭代器就可能会失效。...容器提供了许多有用方法和操作符,使得对元素进行插入、删除和访问变得方便和高效。

10400

【C++】适配器模式 -- stackqueuedqueue

stack 常用接口使用 stack 接口较少,同时其接口使用方法也十分简单,这里我就不再一一演示,如果对某些接口有疑问同学,还是和以前一样,到 cplusplus.com 上面查看使用细节。...;当循环结束后,如果 pushV 中入栈元素全部被 pop 或者 popV 走到了结尾,则说明出栈顺序是正确,反之错误;需要注意是,由于出栈可能是多个元素连续出栈,所以我们需要写成循环。...queue 常用接口使用 queue 接口较少,同时其接口使用方法也十分简单,这里我就不再一一演示,如果对某些接口有疑问同学,还是和以前一样,到 cplusplus.com 上面查看使用细节。...() 队尾将元素val入队列 pop() 将队头元素出队列 2、queue 模拟实现 和 stack 一样,vector 和 list 都可以作为 queue 适配容器,但是由于 queue 需要大量头部删除数据...deque 中部插入删除数据效率是比较低 – 需要挪动数据,但不一定后续 buffe 数组中数据全部挪动,可以控制只挪一部分,即中间插入删除数据效率高于 vector,但是低于 list。

29100

C++初阶:适合新手手撕vector(模拟实现vector

如果当前容量小于 n,则会分配新内存空间,并将原来元素复制到新内存空间中。 首先,它会创建一个新大小为 n 临时数组 tmp,然后将原始数组中元素复制到临时数组中。...接着,释放原始数组内存空间,将 _start 指针指向新分配内存空间,同时更新 _finish 和 _endOfStorage 位置。...迭代器失效意味着该迭代器不再指向有效元素或容器结尾,因此继续使用失效迭代器可能会导致未定义行为。...删除操作:当在容器中删除元素时,可能会导致容器内部元素发生移动,也会导致原先迭代器失效。因为删除元素后,原先迭代器可能指向了一个已经被删除元素,或者指向了不正确位置。...,erase 函数会返回指向被删除元素之后元素迭代器,而不是原先被删除元素迭代器。

27810

C++ std::vector::resize() 方法解析(菜鸟看了秒懂)

本文链接:https://blog.csdn.net/acoolgiser/article/details/102931908 首先介绍一下resize()方法语法解析: 语法定义: C++ 11...如果n小于当前容器大小,则将内容减少到其前n个元素,并删除超出范围元素(并销毁它们)。 如果n大于当前容器大小,则通过末尾插入所需数量元素来扩展内容,以达到n大小。...请注意,此函数通过插入或擦除容器中元素来更改容器实际内容。...再来观察如下代码: // resizing vector #include #include int main () { std::vector...8 > 5 增大数组长度,指定填充元素 myvector.resize(12); 将8个数长度vector数组长度调整为12,用0默认填补,即增加了4个0。

57.5K20

C++编程规范(五)

vector,再后是set或map 2, 用vector和string代替数组 例外:如果编译时数组大小就是固定,则也可以考虑数组 3,使用容器时候只存储值和智能指针和迭代器 比如 vector...理由:Remove算法并不真正地从容器中删除元素,所做就是移动值位置,将不应该删除元素移动到范围开始处,并返回一个迭代器指向最后一个不应该删除元素下一个位置,要真正删除,需要在调用remove...(9.2) 只有需要保留相等元素相对顺序不变时候才使用算法stable_ 版本,请注意 paratial_sort和nth_element都不稳定,无法保留相等元素排序前相对顺序不变 (9.3...n个位置,同时所有其他元素也会正确地处在第n个元素前后 “我头20位最佳销售人员都是谁?”...故可以回答nth_element类似的问题,但同时需要对所匹配元素进行排序(那些不匹配元素不需要排序)问题; “谁是第一?第二?第三?”

56920

STL总结与常见面试题

关联式容器是非线性树结构,更准确说是二叉树结构。各元素之间没有严格物理上顺序关系,也就是说元素容器中并没有保存元素置入容器时逻辑顺序。...pop_back 删除 deque 容器中最后一个元素有效地将容器大小减少一个 pop_front 删除 deque 容器中第一个元素有效地减小其大小 emplace_front deque...普通版本输入序列自身内部重拍元素,_copy 版本完成重拍后写入到指定目的序列中,而不改变输入序列 remove(beg, end, val); // 通过用保留元素覆盖要删除元素实现删除 ==val...- start); vector中erase方法与algorithn中remove方法区别 vector中erase方法真正删除元素,迭代器不能访问了 remove只是简单地将元素移到了容器最后面...erase方法会返回下一个有效迭代器,所以当我们要删除某个元素时,需要it=vec.erase(it);。

3.5K98

STL总结与常见面试题+资料

关联式容器是非线性树结构,更准确说是二叉树结构。各元素之间没有严格物理上顺序关系,也就是说元素容器中并没有保存元素置入容器时逻辑顺序。...pop_back 删除 deque 容器中最后一个元素有效地将容器大小减少一个 pop_front 删除 deque 容器中第一个元素有效地减小其大小 emplace_front deque...list双向链表,是序列容器,允许序列中任何地方进行常数时间插入和擦除操作,并在两个方向上进行迭代,可以高效地进行插入删除元素。...- start); vector中erase方法与algorithn中remove方法区别 vector中erase方法真正删除元素,迭代器不能访问了 remove只是简单地将元素移到了容器最后面...erase方法会返回下一个有效迭代器,所以当我们要删除某个元素时,需要it=vec.erase(it);。

55920
领券