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

C++常见容器用法分析

前言 最近写召回、混排算子时候需要用c++,对我来说就是纯新手入门,这里记录一些常见到容器和他们一些特性。...C++容器属于标准库里STL(StandardTemplateLibrary)里面内容,因此同样是使用std作为namespace。...1. vector std::vector是C++标准库中单端数组,其属于顺序容器(Sequence Containers),同时内存分配是连续,当容量不足以容纳新元素,它会自动重新分配一块更大内存区域...emplace_back是C++11新加,相比于push_back,emplace_back可以直接在std::vector中构造新元素,从而避免了额外拷贝或移动操作。...(看使用场景,也不一定是优点) 【unordered_map缺点】: 无序:哈希表中元素是无序,无法保证按照插入顺序进行迭代。

527100
您找到你想要的搜索结果了吗?
是的
没有找到

C++】STL 容器 - map 关联容器 ② ( map 容器常用 api 操作 | 容器插入元素操作 - map#insert 函数 | 插入 修改 元素操作 - operator[] )

三、代码示例 - map 容器插入 / 更新元素 1、代码示例 2、执行结果 一、map 容器插入元素操作 - map#insert 函数 1、函数原型简介 在 C++ 语言 标准模板库 ( STL...布尔值 , 表示插入是否成功 , 如果键 Key 已经存在 , 则插入失败 , 返回 false ; 如果键 Key 不存在 , 则插入新元素 , 返回 true ; 2、pair 键值对初始化方式...则会出现插入失败情况 ; 这里介绍一种新插入方式 , 使用 数组下标 方式进行插入 , 下面的这种插入方式 , 如果键 “Tom” 不存在 , 则正常插入元素 , 如果该键存在 , 则更新元素...已经存在于 map 关联容器中 , 则更新该 key 对应 Value 值 , 并返回对应键引用 ; 如果给定 参数 key 不存在于 map 关联容器中 , 则会在 map 容器中插入一个新键值对.../ 更新元素 1、代码示例 代码示例 : #include "iostream" using namespace std; #include "map" #include "string" int

12210

【力扣-优先队列】前 K 个高频元素

[1, 数组中不相同元素个数] 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素集合是唯一 进阶: 你所设计算法时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。...然后你可以直接按照出现次序排序,但是这样排序最快要O(nlogn),可以进一步优化,用优先队列来做: 先开一个小根堆,让上面计算出元素和频次依次入队。...如果队列中元素数量小于k个,新元素直接入队,如果已有k个,则让队头元素频次(队中最小)和新元素出现频次比较,如果新元素出现频次小于队头元素频次,说明队列中k个元素频次均大于当前新元素,所以舍弃该新元素...反之如果新元素频次大于队头元素频次,则队头出队,新元素插入。最终队列中k个元素就是出现频次最高k个元素了。...代码 vector topKFrequent(vector& nums, int k) { unordered_map dp; for(auto

28610

Redis 数据类型及操作-列表

如果键不存在,则创建一个新列表。插入多个元素,元素顺序与它们在命令中出现顺序相反。...LPUSHXLPUSHX命令用于在列表头部插入一个新元素仅在列表已经存在才会执行插入操作,语法为:LPUSHX key value其中,key为键名,value为要插入新元素值。...如果键不存在,则不进行任何操作。例如,要在键名为list列表头部插入新元素x,仅在该列表已经存在才执行插入操作,可以使用以下命令:LPUSHX list x2.11....RPUSHXRPUSHX命令用于在列表尾部插入一个新元素仅在列表已经存在才会执行插入操作,语法为:RPUSHX key value其中,key为键名,value为要插入新元素值。...如果键不存在,则不进行任何操作。例如,要在键名为list列表尾部插入新元素x,仅在该列表已经存在才执行插入操作,可以使用以下命令:RPUSHX list x2.12.

23510

C++ STL容器如何解决线程安全问题?

所谓『写操作』在这里不是插入新元素,而是修改旧元素。 如果N最大个数是可以预期就直接设置就好,如果没办法预期就再把vector搞成ring buffer(环形队列)来缓解压力。...它有一些限制条件,只能看是否满足你需要了。 当有多个写线程对情况下,并发地插入 map/unordered_map都会引发core dump。...不过如果你没办法保证多个写线程不会同时修改同一个keyvalue,那么可能存在value覆盖。无法保证这点,还是需要加锁。...gcc 4.7.2unordered_map实现曾被爆出有这个问题。原因插入元素,触发了rehash,让其他线程在unordered_map中查找过程之中,出现了core dump。...一般网络上谈论伪共享所举例子,并不是一个vector中多个元素之间并行读写触发了伪共享。

2.8K20

C++标准库类型vector

头文件 #include using std::vector; 定义和初始化 vector常用初始化方法为: // 默认初始化: v不含任何元素, 但是只能添加类型T元素 vector...// 1个int元素, 该元素10 std::vector v7(10, 1); // 10个int元素, 每个都初始化为1 std::vector v8{10...只有一种例外情况,就是所有元素值都一样。一旦元素值有所不同,更有效方法是先定义一个空vector对象,再在运行时向其中添加具体值。...2. vector对象增长机制 Tips:这种分配策略比每次添加新元素都重新分配容器内存空间策略要高效得多。...由于元素必须连续存储,每次添加新元素容器必须分配新内容空间来保存已有元素和新元素,将已有元素从旧位置移动到新空间中,添加完新元素后释放旧存储空间。

1.1K10

关联容器小结

对于有序关联容器中关键字类型要求 对与有序关联容器而言,关键字类型必须定义元素比较方法(这一点尤其重要),默认,使用关键字类型<运算符来比较两个关键字。.../当关键字不在容器插入 emplace(p,args);//从容器p位置开始搜索新元素args插入位置 对于插入一个元素insert(value_type)和emplace(value_type...对于下标而言,如果该关键字在容器中不存在,那么**就会被当作一个新元素加入到容器中去。**at函数没有这样作用,它只会对参数进行检查,如果不存在就抛出一个out_of_range异常。...如果不存在则返回一个不影响排序关键字插入位置(即如果要将这个不存在关键字插入到容器中要放入位置)。...当关键字存在,两个迭代器就是刚才用lower_bound和upper_bound得到迭代器。当不存在,也返回不影响排序关键字插入位置。

44711

C++(STL):13--- list插入和访问元素

list 模板类中,与“添加或插入新元素”相关成员方法有如下几个: push_front():向 list 容器首个元素前添加新元素; push_back():向 list 容器最后一个元素后添加新元素...():在指定位置插入新元素; splice():将其他 list 容器存储多个元素添加到当前 list 容器指定位置处。...语法格式 用法说明 iterator insert(pos,elem) 在迭代器 pos 指定位置之前插入一个新元素 elem,并返回表示新插入元素位置迭代器。...这是因为,后者是 C++ 11 标准新添加,在大多数场景中,都可以完全替代前者实现同样功能。更重要是,实现同样功能,emplace 系列方法执行效率更高。...,我们不仅能分别获取当前 list 容器中首尾元素,必要还能修改它们值。

2K20

一文带你掌握 优先级队列

个人主页: :✨✨✨初阶牛✨✨✨ 强烈推荐优质专栏: C++世界(持续更新中) 推荐专栏1: C语言初阶 推荐专栏2: C语言进阶 个人信条: 知行合一 本篇简介:>:讲解C++优先级队列相关知识...二、priority_queue接口介绍 接口名 解释 empty() 判断是否为空优先级队列 size() 返回优先级队列中有效元素个数 top() 返回堆顶数据 push() 将新元素插入进优先级队列...: 前面说了,优先级队列就是堆,那么堆算法中,元素比较方法会决定是大堆还是小堆....仿函数介绍 C++仿函数是一种函数对象,它可以像普通函数一样使用,但是它是一个类对象。 仿函数可以像函数一样被调用,并且可以在函数调用之间保持状态,这非常有用。...void push(const T& x) { c.push_back(x); //尾插入堆 Adjust_Up(c.size()-1); //将新元素下标传参,使其向上调整形成堆

19910

STL中有哪些副作用或稍不注意会产生性能开销地方?

其实C++标准明确指出不管是序列容器(比如vector)还是关联容器(比如unordered_map)其clear()成员函数都是线性时间复杂度O(n)。...下面简要概述一下,对于unordered_map而言,其中元素类型是: std::pair 如果你这样遍历: std::unordered_map m; for (auto& p: m) { ... } 减少隐性重复操作 从map中查找某个key对应value...我在之前文章C++ STL容器如何解决线程安全问题? 中有写过: 并发多个线程去写STL容器(“写”指的是插入新元素) 不是线程安全,可能会触发core dump。...对于unordered_map也是类似,单线程不停插入元素的话,可能触发rehash,导致其他线程中在unordered_map中find过程中core dump。

1.2K10

C++(STL):34--- multiset容器详解

所谓“相似”,是指 multiset 容器遵循 set 容器前 3 个特性,仅在第 4 条特性上有差异。和 set 容器不同是,multiset 容器可以存储多个值相同元素。...multiset容器,需手动注明 std 命名空间(强烈建议初学者使用)。...创建C++ multiset容器方法 创建 multiset 容器,无疑需要调用 multiset 类模板中构造函数。...C++ multiset容器提供成员方法 multiset 容器提供成员方法,和 set 容器提供完全一样,如表 1 所示。...emplace_hint() 本质上和 emplace() 在 multiset 容器中构造新元素方式是一样,不同之处在于,使用者必须为该方法提供一个指示新元素生成位置迭代器,并作为该方法第一个参数

1.1K20

C++(STL):26 ---关联式容器set用法

容器,需手动注明 std 命名空间(强烈建议初学者使用)。...//或者 //std::set copyset = retSet(); 注意,由于 retSet() 函数返回值是一个临时 set 容器,因此在初始化 copyset 容器...> 降序规则,myset 容器中元素存储顺序为: "php" "nodejs" "c++" C++ STL set容器包含成员方法 表 1 列出了 set 容器提供常用成员方法以及各自功能。...emplace_hint() 在本质上和 emplace() 在 set 容器中构造新元素方式是一样,不同之处在于,使用者必须为该方法提供一个指示新元素生成位置迭代器,并作为该方法第一个参数。...() << endl; //向myset容器中插入新元素 myset.insert("http://c.biancheng.net/java/"); myset.insert("http://c.biancheng.net

55710

unorder(哈希-海量数据处理)

插入 通过哈希函数获取待插入元素在哈希表中位置 如果该位置中没有元素则直接插入新元素,如果该位置中有元素发生哈希冲突,使用线性探测找到下一个空位置,插入新元素 ?...开散列最好情况是:每个哈希桶中刚好挂一个节点,再继续插入元素,每一次都会发生哈希冲突,因此**,在元素个数刚好等于桶个数,可以给哈希表增容**。...一种紧凑型、比较巧妙概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。..._bmp.Test(index5)) return false; return true; // 有可能在 } 注意:布隆过滤器如果说某个元素不存在,该元素一定不存在,如果该元素存在...支持删除方法:将布隆过滤器中每个比特位扩展成一个小计数器,插入元素给k个计数器(k个哈希函数计算出哈希地址)加一,删除元素,给k个计数器减一,通过多占用几倍存储空间代价来增加删除操作。

1K21

C++(STL):19---deque之删除和emplace用法

push_front() 在容器现有元素头部添加一个元素,和 emplace_back() 不同,该函数添加新元素过程是,先构造元素,然后再将该元素移动或复制到容器头部。...pop_front() 移除容器尾部一个元素。 emplace_back() C++ 11 新添加成员函数,其功能是在容器尾部生成一个元素。...和 emplace() 不同是,该函数添加新元素过程是,先构造元素,然后再将该元素移动或复制到容器指定位置。...emplace() C++ 11 新添加成员函数,其功能是 insert() 相同,即在指定位置直接生成一个元素。...语法格式 功能 iterator insert(pos,elem) 在迭代器 pos 指定位置之前插入一个新元素elem,并返回表示新插入元素位置迭代器。

1.2K40

STL之关联式容器map(二)

本文续:STL之关联式容器map(一) 3构造元素 emplace() 可以在适当位置直接构造新元素,从而避免复制和移动操作。 当容器中现有元素键与这个元素键不同时,才会构造这个元素。...pair 成员变量 first 是一个指向插入元素或阻止插入元素迭代器;成员变量 second 是个布尔值,如果元素插入成功,second 就为 true。...emplace_hint() 返回值不是一个 pair 对象,如果新元素插入,它返回是指向新元素迭代器;如果没有插入,返回是和这个键匹配现有元素迭代器。...,所以用它生成了新元素。...当索引不在范围内,这个函数将抛出一个异常, //这种情况不应该发生;如果真的发生,这会是程序中一个 bug。

53020

C++ 顺序容器基础知识总结

C++标准所讲,forward_list容器支持前向遍历元素序列,允许常数时间内在任意位置插入或删除操作并进行自动内存管理。...是唯一一个在给定位置之后插入新元素容器。...为此,forward_list提供了如下插入接口: 接口 描述 insert_after 在给定位置之后插入新元素 emplace_after 在给定位置之后构造新元素 erase_after 删除给定位置之后元素...而如果我们是在指定位置之后插入新元素,则无需线性时间查找操作,这样可实现常数时间插入: ?...array为静态数组,有着静态数组最大缺点:每次只能分配一定大小存储空间,当有新元素插入时,要经历 “找到更大内存空间”->“把数据复制到新空间” ->“销毁旧空间” 三部曲, 对于std::array

1.3K50
领券