![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c++/alg
文章平均质量分 67
C++,数据结构与算法
LIEYz
这个作者很懒,什么都没留下…
展开
-
一致性哈希算法原理
一致性哈希算法通过一个叫作一致性哈希环的数据结构实现。这个环的起点是 0,终点是2^32 -1, 并且起点与终点连接,故这个环的整数分布范围是 [0, 2^32-1]原创 2021-11-16 10:52:15 · 387 阅读 · 0 评论 -
互斥锁、自旋锁、读写锁、可重入锁、悲观锁、乐观锁
互斥锁使用场景: 如果你能确定被锁住的代码执行时间很长,就应该用互斥锁原创 2021-10-29 16:18:01 · 753 阅读 · 1 评论 -
复杂度分析与基本算法思想
算法衡量的维度时间维度:是指执行当前算法所消耗的时间,通常用时间复杂度来描述。空间维度:是指执行当前算法需要占用多少内存空间,通常用空间复杂度来描述。复杂度描述大O符号表示法,即 T(n) = O(f(n)), 其中 n 表示数据规模 ,O(f(n))表示运行算法所需要执行的指令数,和f(n)成正比。常见的时间复杂度量级常数阶O(1)代码执行的行数是固定的:void swapTwoInts(int &a, int &b){ int temp = a; a =原创 2020-12-17 11:09:26 · 209 阅读 · 0 评论 -
c++ vector容器emplace_back() 和 push_back 的区别
push_back 加入元素需要先构造然后拷贝或移动,而emplace_back可以原地构造对象,然后加入到容器中,可以减少一次拷贝或构造。测试代码如下:typedef struct testEmplace { testEmplace() { std::cout << "create testEmplace" << std::endl; } testEmplace(int a) { std::cout &原创 2020-11-20 14:48:59 · 4174 阅读 · 0 评论 -
C++并发编程之condition_variable
<condition_variable > 头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable 和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit()std::condition_variable::wait()std::condition_variable 提供了两种 wait() 函数。当前线程调用 wai原创 2020-11-04 11:15:33 · 490 阅读 · 0 评论 -
C++并发编程之atomic
原子类型对象的主要特点就是从不同线程访问不会导致数据竞争(data race)。因此从不同线程访问某个原子对象是良性 (well-defined) 行为,而通常对于非原子类型而言,并发访问某个对象(如果不做任何同步操作)会导致未定义 (undifined) 行为发生。std::atomic_flagstd::atomic_flag是一个bool类型的原子变量,它有两个状态set和clear,对应着flag为true和false。std::atomic_flag使用前必须被ATOMIC_FLAG原创 2020-08-03 11:39:00 · 742 阅读 · 0 评论 -
C++抽象类和接口的区别
纯虚函数纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法(virtual ReturnType Function()= 0)。抽象类带有纯虚函数的类称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。接口如果一个类里面只有纯虚函数,没有其他成员函数和数据成员,就是接口类。既然有抽象类,原创 2020-07-17 13:49:08 · 2491 阅读 · 0 评论 -
C++并发编程之future
不同于pthread_join可以获取线程函数的返回值,std::thread的join函数并不能获取线程函数的返回值。C++11给出的解决方案是使用std::promise和std::future.std::futurestd::future提供了一种访问异步操作结果的机制,但是我们也可以以同步等待的方式来获取结果,可以通过查询future的状态(future_status)来获取异步操作的结果。//查询future的状态std::future_status status; do {原创 2020-07-15 17:41:50 · 1611 阅读 · 1 评论 -
设计模式总结
对象适配器通过委派与adaptee衔接,即持有adaptee对象,是动态的方式;类适配器通过集成与adaptee衔接,也就是说类适配器继承adaptee,并且实现target方法,是静态的方式。由于对象适配器采用动态的方式与adaptee衔接,使得它可以对不同的适配源及其子类进行适配类适配器可以重定义实现行为,而对象适配器重定义适配的行为比较困难,但是添加行为较方便。总结:尽...原创 2020-01-18 11:33:42 · 949 阅读 · 0 评论 -
C++对象的内存布局
简单对象非静态成员变量和虚函数是决定类大小的唯一两个因素非静态成员变量在类的内存里会有字节对齐如果对象中包含虚函数,会增加4个字节的空间,不论有多少个虚函数。静态成员变量,静态成员函数和非静态成员函数不会影响对象内存的大小。静态成员变量存储在内存的静态数据区。另外:非静态成员函数和程序普通函数的函数区别是,类的非静态成员函数函数有this指针,所以可以访问类的成员。静态成员函数不可以调用...原创 2020-03-27 16:18:36 · 196 阅读 · 0 评论 -
C++ pair, tuple
pairpair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first、second,因为是使用struct不是class,所以可以直接使用pair的成员变量。make_pair函数template...原创 2020-03-17 11:02:12 · 364 阅读 · 0 评论 -
C++ 可变参数模板
可变参数函数C++中可变参数的函数是从C中继承而来,可变参数的函数是指函数的参数个数可变,参数类型不定的函数。可变参数函数实现原理函数的调用的参数会进行压栈处理,而对参数的压栈是从右到左进行压栈。而参数和参数之间存放是连续的,也就是说,只要知道第一个参数的地址和类型,以及其他参数的类型,就可以获取各个参数的地址。int printf(const char* format, ...);pr...原创 2020-03-16 14:31:16 · 241 阅读 · 0 评论 -
C++ Lambda 表达式
C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。声明Lambda表达式[capture list] (params list) mutable exception-> return type { function body }各项具体含义如下capture list:捕获外部变量列表params list:形参列表mutable指示符:用...原创 2020-03-16 11:44:25 · 161 阅读 · 0 评论 -
C++并发编程之thread
c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的:void f(int n);std::thread t(f, n + 1);t.join();不同于pthread_join可以获取线程函数的返回值,std::thread的join函数并不能获取线程函数的返回值。C++11给出的解决方案是使用std::promise和std::future.std::fut...原创 2020-03-12 16:38:36 · 392 阅读 · 0 评论 -
C++移动语义和完美转发
左值、右值左值和右值的区分方法:能不能对表达式取地址,如果能,则为左值,否则为右值。左值引用、右值引用左值引用只能绑定左值,右值引用只能绑定右值,如果绑定的不对,编译就会失败。但是,常量左值引用是一个“万能”的引用类型,它可以绑定非常量左值、常量左值、右值。const int & a = 1; //常量左值引用绑定 右值, 不会报错class A { public: ...原创 2020-03-06 14:45:01 · 608 阅读 · 0 评论 -
C++ 杂项
c++11引入了auto类型说明符,auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值,可以和范围for循环组合使用。#include<iostream>using namespace std;int main(){ string s("hello world"); for(auto c:s) c='t'; cout<<s<...原创 2020-03-13 15:55:24 · 1042 阅读 · 0 评论 -
C++并发编程之mutex
std::lock_guard与mutex配合使用,把锁放到lock_guard中时,mutex自动上锁,lock_guard析构时,同时把mutex解锁。#include <thread> #include <mutex> int g_i = 0; std::mutex g_i_mutex; void safe_increment() { st...原创 2020-01-15 16:09:43 · 459 阅读 · 0 评论 -
C++常见编译和运行期错误
对‘vtable for XXX’未定义的引用原因分析:父类中的虚函数只有声明,没有定义。解决方案:1.定义相关的虚函数的实现2.定义成纯虚函数留给后代实现,virtual int broadcast(const char* pBuf, const unsigned bufSize) = 0C++模版声明与定义分开报错C++编译以文件为单位,每一个对象所占用的空间大小,是在编译的时候就...原创 2019-11-15 09:26:37 · 799 阅读 · 0 评论 -
C++ 智能指针
weak_ptr不能直接用来定义一个智能指针的对象,只能配合shared_ptr来使用,解决shared_ptr循环引用的问题。循环引用如图所示,即使对象ptr_a和ptr_b被销毁,也就是①③两条引用会被断开,但是②④两条引用依然存在,每一个的引用计数都不为0,结果就导致其指向的内部对象无法析构,造成内存泄漏。解决这种状况的办法就是将两个类中的一个成员变量改为weak_ptr对象,因为w...原创 2019-11-06 09:36:12 · 167 阅读 · 0 评论 -
C++编码规范
常量一组相关的整型常量应定义为枚举编译器会检查参数值是否是否位于枚举取值范围内应当尽量避免枚举值重复,如必须重复也要用已定义的枚举来修饰typedef enum{ RTCP_SR = 200, RTCP_MIN_TYPE = RTCP_SR, //must be lowest known type RTCP_RR = 201, RTCP_SDES = 202, RTCP_B...原创 2019-10-28 15:50:36 · 515 阅读 · 0 评论