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

高效的使用stl::mapstd::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.1K10
您找到你想要的搜索结果了吗?
是的
没有找到

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

32110

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_lock alock(this->root_lock_); // 更新

46010

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

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

41610

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

35050

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

1.9K30

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

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::map<WidgetID, std::weak_ptr...std::shared_ptr 建议使用 make 系列函数的额外场景包括:@自 // 定义内存管理的类;@内存紧张的系统、非常大的对象、以及存在比指涉 // 到相同对象的 std: :shared_ptr

99920

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

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

45720

C++ 智能指针详解

访问智能指针原来的方法则使用“.”操作符。 访问智能指针包含的裸指针则可以用 get() 函数。...智能指针包含了 reset() 方法,如果传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。...// 使用 operator-> 调用智能指针对象中的函数 my_memory.get()->info_extend = "Addition";      // 使用 get() 返回裸指针,然后给内部对象赋值...跟 boost::shared_ptr 一样,内部使用了引用计数。...4、在需要访问 boost::shared_ptr 对象,而又不想改变其引用计数的情况下,使用boost::weak_ptr,一般常用于软件框架设计中。

1.9K10

智能指针详解

主线程在启动另一个线程后早期销毁了资源,而另一个线程仍在使用已经销毁的资源。这会导致未定义行为,访问无效的内存,可能导致崩溃或数据损坏。...智能指针封装了指向堆分配对象的原始指针,因此智能指针通常提供直接访问其原始指针的方法。 C++ 标准库智能指针拥有一个用于此目的的get成员函数。...与std::unique_ptr不同,std::shared_ptr允许多个智能指针共享对同一个对象的所有权,通过引用计数来跟踪资源的使用情况。...如果想要使用原生指针的方法,需要将其先转换为一个std::shared_ptr。 weak_ptr可以通过一个shared_ptr创建。...shared_ptr a1(new Obj()); weak_ptr weak_a1 = a1; //增加引用计数,避免循环引用 // expired()判断所指向的原生指针是否被释放

20940

智能指针-使用、避坑和实现

独占的意思就是共享,所有权可以转移,但是转移之后,所有权也是独占。auto_ptr和unique_ptr就是一种独占所有权方式的智能指针。...和shared_ptr不同的地方在于,其并不会拥有资源,也就是说不能访问对象所提供的成员函数,不过,可以通过weak_ptr.lock()来产生一个拥有访问权限的shared_ptr。...shared_ptr为了支持跨线程访问,其内部有一个引用计数(线程安全),用来记录当前使用该资源的shared_ptr个数,在结束使用的时候,引用计数为-1,当引用计数为0时,会自动释放其关联的资源。...智能指针混用 代码如下: void fun() { std::unique_ptr t(new Type); std::shared_ptr t1(t.get()); }...避免使用get()获取原生指针 void fun(){ auto ptr = std::make_shared(); auto a= ptr.get(); std::shared_ptr

82610
领券