首页
学习
活动
专区
圈层
工具
发布

高效的使用stl::map和std::set

1、低效率的用法 // 先查找是否存在,如果不存在,则插入 if (map.find(X) == map::end()) // 需要find一次 {     map.insert(x); // 需要find...一次 } // 下面这段代码是一个意思 if (0 == map.count(X) // 需要find一次 {     map.insert(x); // 需要find一次 } // 或者是先判断是否存在...,如果不存在则插入,反之如果存在则修改 if (map.count(X) > 0) // 需要find一次 {     map.erase(X); // 需要find一次 } map.insert(x)...; // 需要find一次 // 对于erase存在同样低效的用法 if (map.count(X) > 0) // 需要find一次 {     map.erase(X); // 需要find一次 }...else {     // 不存在时的处理 } 2、高效率的用法 // 解决办法,充分利用insert和erase的返回值,将find次数降为1 map::size_type num_erased =

3.2K20

std::shared_ptr 的线程安全性 & 在多线程中的使用注意事项

std::shared_ptr 是个类模版,无法孤立存在的,因此实际使用中,我们都是使用他的具体模版类。...这里使用 std::shared_ptr 来举例,我们讨论的时候,其实上是在讨论 std::shared_ptr 的线程安全性,并不是 SomeType 的线程安全性。...() 函数是否线程安全,这里显示是非线程安全的,因为对 some_value 的操作没有加锁,也没有使用 atomic 类型,多线程访问就出现未定义行为(UB) std::shared_ptr 线程安全性...当然,对于不同的裸指针的 std::shared_ptr 实例,更是线程安全的 这里的 “成员函数” 指的是 std::shared_ptr 的成员函数,比如 get ()、reset ()、 operrator...->() 等) 多线程环境中,对于同一个 std::shared_ptr 实例,只有访问 const 的成员函数,才是线程安全的,对于非 const 成员函数,是非线程安全的,需要加锁访问。

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

    C++17 中对数组的支持:std::shared_ptr 的深入理解与使用

    使用 new 表达式创建数组(不推荐)虽然可以直接使用 new 表达式来创建 std::shared_ptr 数组,但这种方式并不推荐。...以下是一个使用 new 表达式创建数组的示例:#include #include int main() { // 使用 new 表达式创建数组(不推荐)...访问数组元素访问 std::shared_ptr 管理的数组元素非常简单,可以通过指针运算符 [] 来实现。...0;}在这个示例中,我们通过 sp1[0] 访问并修改了数组的第一个元素。...如果需要在函数内部共享资源的所有权,使多个 std::shared_ptr 指向同一个资源,则可以按值传递;如果只是需要访问资源而不需要共享所有权,则可以按引用传递,避免不必要的引用计数增加。

    81200

    C++11 weak_ptr 原理与详细教程

    weak_ptr 本身不拥有对象的所有权,仅提供对 shared_ptr 管理对象的临时访问能力,不会影响对象的生命周期。...核心优势打破循环引用:解决 shared_ptr 形成的循环引用导致的内存泄漏非侵入式观察:不增加引用计数,不影响对象的销毁时机安全访问:提供 lock() 方法安全获取对象访问权,避免悬垂指针轻量级设计...可能是悬垂指针 } 正确做法:始终通过 lock() 获取 shared_ptr 后再访问不要存储 lock() 返回的临时 shared_ptr // 不推荐:延长了对象生命周期 std...直接访问直接访问线程安全是(引用计数操作)是(引用计数操作)否选择建议:当需要共享资源时,使用 shared_ptr当需要独占资源时,使用 unique_ptr(性能更优)当需要观察 shared_ptr...其核心特点包括:非所有权引用:不拥有对象,不影响对象生命周期循环引用解决方案:打破 shared_ptr 形成的引用循环安全访问机制:通过 lock() 方法安全获取对象访问权轻量级设计:仅需存储控制块指针

    38710

    C++常见避坑指南

    如果多个执行线程在没有同步的情况下访问同一个 shared_ptr 实例,并且这些访问中的任何一个使用了 shared_ptr 的非 const 成员函数,则会发生数据竞争;可以使用shared_ptr...多线程环境中,对于同一个std::shared_ptr实例,只有访问const的成员函数,才是线程安全的,对于非const成员函数,是非线程安全的,需要加锁访问。...因此,在使用 [] 运算符访问 std::map 中的元素时,应该始终确保该键已经存在或者在插入新键值对时指定了默认值。...,即当其他线程将来调用get()来访问共享状态时,将调用函数 std::launch::async | std::launch::deferred 它是默认行为。...使用此启动策略,它可以异步运行或不异步运行,具体取决于系统上的负载,但我们无法控制它 如果我们不指定启动策略,其行为类似于std::launch::async | std::launch::deferred

    1.1K10

    C++11 shared_ptr 原理与详细教程

    :指向实际管理的对象2.3 内存布局shared_ptr 通常包含两个指针大小的成员:指向管理对象的指针(get() 返回的值)指向控制块的指针undefined当使用 std::make_shared.../ 不推荐:二次分配 auto sp3 = std::shared_ptr(sp2); // 拷贝构造,引用计数变为2 std::cout 不增加引用计数};weak_ptr 特性:不拥有对象所有权,不增加引用计数可通过 lock() 方法获取 shared_ptr(如果对象存在)用于解决循环引用问题可通过 expired()...>(new MyClass()); // 不推荐避免使用 get() 返回的原始指针不要将 get() 返回的指针交给另一个智能指针不要手动释放 get() 返回的指针正确处理数组(C++17前)C++...17 前 shared_ptr 不直接支持数组,需提供自定义删除器 // C++17 前管理数组的正确方式 std::shared_ptr arr_ptr(new int[5], std

    68110

    实现一个strong_rc_ptr(非线程安全版本的std::shared_ptr)

    std::shared_ptr 底层的实现是使用 std::atomic 来维护了引用计数。每次变更操作都会导致 std::atomic 增减,同时带来 CPU Cache Line 失效。...其实GCC的 STL本身自带费线程安全的内部版本的,可以通过使用 template using strong_rc_ptr = std::__shared_ptrstd:...这样大多数场景访问指针内容的时候不需要多一次跳转去查询实际地址。 接下来更多的代码其实是在适配和优化各种使用场景。 首先是针对各类构造场景,我的实现分成了5种。...简单的循环benchmark其实也没啥意义,因为和实际使用场景的访问情况相差太远了。...我们在完成之后对我们实际项目路14-16个静态索引的交易行上下架请求和搜索的场景做了对比(不包含Excel读表改造),大概比 std::shared_ptr 提升了10%-16%的综合性能,这里面其实附带了其他的一些视图和索引的比较操作和其他

    37010

    CMU 15445 2023fall #Project0 实现一个简单的k-v存储引擎

    在写时复制trie中,操作不直接修改原始trie的节点。而是为修改后的数据创建新的节点,并为新修改的trie返回新的根。在root中插入 ("ad", 2) 。...遍历key的字符,如果当前字符在cur的子节点map中,则让cur等于当前字符在cur的子节点中的映射节点继续遍历;否则不存在该key,直接返回nullptr即可。 最后把找到的value指针返回。...注意,值的类型可能是不可复制的(即, std::unique_ptr 因此需要使用移动语义)。这个方法返回一个新的trie,也就是说,实现写时拷贝。...刚刚实现了单线程环境中使用的写时复制trie,接下来多线程环境实现一个并发控制的键值存储。 对于Get操作,先获取访问控制锁,防止此时其他写进程修改trie。...>(key, std::move(value)); // 再获取访问锁 std::unique_lockstd::mutex> alock(this->root_lock_); // 更新

    1.1K10

    C++11 智能指针:优化资源管理,规避内存泄漏的利器

    4、使用weak_ptr解决循环引用问题 、weak_ptr 简介 weak_ptr不⽀持RAII,也不支持访问资源,所以我们看⽂档发现weak_ptr构造时不⽀持绑定到资 源,只支持绑定到shared_ptr...weak_ptr也没有重载operator*和operator->等,因为他不参与资源管理,那么如果他绑定的 shared_ptr已经释放了资源,那么他去访问资源就是很危险的。...weak_ptr(const shared_ptr& sp) :_ptr(sp.get())//shared_ptr 的get函数返回指向资源的对象的指针 {} //weak_ptr也支持用...//weak_ptr 不增加引用计数 std::weak_ptr _next; std::weak_ptr _prev; ~ListNode() {...在使用shared_ptr时,需要注意对象的访问和修改是否在多个线程中同时进行,以及在析构对象时是否存在资源竞争等问题.

    55310

    女朋友:七夕,你的 HttpServer 又崩了......

    ::mapstd::string, std::shared_ptr>     m_mapSessions;     std::mutex                                              ...::mapstd::string, std::shared_ptr>     m_mapSessions;     std::mutex                                              ...::mapstd::string, std::shared_ptr>     m_mapSessions;     std::mutex                                              ...的原始指针管理这个 EventLoop 的,唯独 HttpConnection 使用了一个 std::shared_ptr 管理 EventLoop,这会不会有问题?...有问题,假设创建一个 HttpConnection 后(接受连接),释放 HttpConnection(断开连接),由于 HttpConnection 使用了 std::shared_ptr 管理 EventLoop

    62710

    《C++并发编程实战》读书笔记(4):设计并发数据结构

    此外,发现吴天明版的中译本有太多太离谱的翻译错误了,还得是中英对照才行:) 第6章 设计基于锁的并发数据结构 设计支持并发访问的数据结构时,一方面需要确保访问安全,通常需要限定其提供的接口,另一方面需要是按真正的并发操作...= get_tail(); }); return std::move(head_lock); } node* get_tail() { std:...例如对于字典来说,首先只考虑基本操作增删改查,其次实现上来说散列表比二叉树和有序数组更支持细粒度的锁,因此必须放弃std::map支持的多余接口、迭代器操作、默认的底层实现。.../ 头节点弹出栈,当前线程也不访问,总共减2 int const count_increase = old_head.external_count - 2;...如果想自行设计,请注意以下原则: 1、在原型设计中使用std::memory_order_seq_cst次序,便于分析和推理; 2、使用无锁的内存回收方案,例如上面的引用计数;

    63250

    基础知识_Cpp

    * 不直接使用命名空间using namespace xxx,可以使用using std::cin;using std::cout;这种方式。 * 也可以在需要的地方全部加上std:: 。...推荐阅读《STL源码剖析》 & 知无涯之std::sort源码剖析 另sort为什么不直接用稳定的堆排序实现?堆排序在排序过程中是跳跃式地访问元素,缓存命中率较低。...shared_ptr p=std::make_shared(); shared_ptr p(new int(10)); 使用方式 shared_ptr p1=std::make_shared...) 注意事项 1.不混合使用普通指针和智能指针 //有如下函数: void process(shared_ptr ptr){ 使用ptr }//离开作用域,ptr被销毁。...可以这样使用: shared_ptr p1=std::make_shared(1024); process(p1); 2.智能指针内部有一个get()函数,可以获取到原生指针。

    2.5K30
    领券