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

高效的使用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 =

2.9K20

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 成员函数,是非线程安全的,需要加锁访问。

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

    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 指向同一个资源,则可以按值传递;如果只是需要访问资源而不需要共享所有权,则可以按引用传递,避免不必要的引用计数增加。

    8600

    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

    55510

    实现一个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%的综合性能,这里面其实附带了其他的一些视图和索引的比较操作和其他

    10110

    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_); // 更新

    85210

    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时,需要注意对象的访问和修改是否在多个线程中同时进行,以及在析构对象时是否存在资源竞争等问题.

    13610

    女朋友:七夕,你的 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

    45010

    《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、使用无锁的内存回收方案,例如上面的引用计数;

    44950

    基础知识_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()函数,可以获取到原生指针。

    2K30

    智能指针在面试中得重要地位!

    get() 获取当前 unique_ptr 指针内部包含的普通指针。 get_deleter() 获取当前 unique_ptr 指针释放堆内存空间所用的规则。...:如何校验 std::weak_ptr是否失效 //在未失效的条件下提供对指涉到的对象的访问:这个操作通过由 std::weak_ptr创建std::shared_ptr来实现 //方式一:std::weak_ptr... fastLoadWidget(WidgetID id) // { // //unordered_map 不能使用自定义的类型作为 key值,因此底层时候的是 std...::hash // //map使用 std::less可以使用自定义类型,里面没有WidgetID的比较函数 // static std::mapstd::weak_ptr...std::shared_ptr 不建议使用 make 系列函数的额外场景包括:@自 // 定义内存管理的类;@内存紧张的系统、非常大的对象、以及存在比指涉 // 到相同对象的 std: :shared_ptr

    1K20

    C++的智能指针unique_ptr、shared_ptr和weak_ptr

    (new int(42)); // 使用指针操作符和解引用操作符访问所指向对象的值 std::cout std::endl; // 输出: 42 //...operator->:箭头操作符,用于通过 unique_ptr 访问对象的成员函数或成员变量。 get:返回指向所管理对象的裸指针。...指针语义:shared_ptr的使用方式与原始指针相似,可以通过指针操作符(->)和解引用操作符(*)来访问所指向对象的成员。 可拷贝:shared_ptr是可拷贝的,即可以进行复制构造和赋值操作。...(new int(42)); // 使用指针操作符和解引用操作符访问所指向对象的值 std::cout std::endl; // 输出: 42 /...operator->:箭头操作符,用于通过 shared_ptr 访问对象的成员函数或成员变量。 get:返回指向所管理对象的裸指针。

    1.1K20
    领券