自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hanhan的博客

博观而约取,厚积而薄发

  • 博客(584)
  • 资源 (6)
  • 收藏
  • 关注

原创 置顶 | wolai博客

最近用wolai记录笔记较多,这里放一下我wolai的地址,当然csdn这边也会同时更文。hanhan的博客

2022-05-08 21:59:11 711

原创 《拾牙慧者博客检索指南》

本指南主要概括一下我的博客所涉及到的一些方面,以及给出每个专栏的索引,方便以后自己以及他人的查找相关文章。专栏总览《嵌入式编程经验》《图像处理与计算机视觉经验》《机器学习笔记与数学》《算法与数据结构笔记》《C/C++编程细节》《编程思想笔记》《大学课程笔记》《环境配置》下面逐个介绍每个专栏:《嵌入式编程经验》主要涉及了参加的两个比赛以及对FreeRTOS一些使用笔记。智能车笔记主要分为图像和控制的编程经验。电子设计竞赛主要是对openmv的使用经验和题解。嵌入式操作系统主要是对嵌入式理论课

2021-02-19 22:11:44 1849

原创 C++简单实现布隆过滤器

布隆过滤器是一种空间效率高、适用于大规模数据集的概率性数据结构。它可以帮助快速判断一个元素是否可能存在于一个集合中,以及可能不存在于集合中(有一定的误判率)。

2023-12-18 23:43:00 227

原创 CMPXCHG和lwarx (LL)/stwcx (SC)

如果不使用循环来重试 CAS 操作,那么在竞争激烈的情况下,单次 CAS 操作失败后,程序可能就会放弃修改,这样会导致并发操作的数据一致性出现问题。通过在循环中重试 CAS 操作,可以确保在 CAS 操作成功之前不会跳出循环,从而保证了原子性和一致性。一种常见的方法是创建一个结构体,其中包含指向数据的指针以及版本号或标记,并使用原子操作来更新和比较这两个值。总之,即使使用了原子操作函数,也仍然需要搭配使用循环,以确保 CAS 操作的成功和数据的一致性。当CAS操作失败时,可以检查版本戳并采取适当的行动。

2023-12-18 23:41:51 130

原创 【C++】RVO、NRVO优化以及返回值优化失效的场景

但结论是明显的,移动语义可以解决编译器无法解决的优化问题,因而总是有用的。对于下面这样的代码,一旦打开g++/clang++的RVO/NRVO,从ReturnValue函数中a变量拷贝/移动构造临时变量,以及从临时变量拷贝/移动构造b的二重奏就通通没有了。需要注意的是,无论RVO是否生效,代码的行为应始终符合C++语言中对拷贝构造函数、析构函数和移动构造函数的要求。返回值优化(Return Value Optimization,RVO)是一种编译器优化技术,旨在减少函数返回对象的副本构造和析构成本。

2023-12-14 23:58:16 352

原创 【C++】实现一个数组均分函数

后,移动并不会改变原始向量的大小。相反,它只是将元素的所有权从一个容器转移到另一个容器,这意味着在移动后原始向量变为空(或者说内部元素被置空),但其大小并不会随之改变。在这之前我们有了解过make_move_iterator的使用方式,可以帮我们免去拷贝。的结果仍然会显示为原始向量的初始大小,而不是 0,尽管元素已经被移走并且值为空。如果你想要获取移动后的新向量。来获取新向量的元素个数。在你的代码中,当你使用。所以,在你的情况下,

2023-12-14 23:52:13 141

原创 【C++】简化for-range的算法函数

这段代码使用了lambda表达式作为std::transform函数的第四个参数,用于将mat_set中的所有ComplexMat对象存储到res向量中。用于对一个序列中的每个元素进行转换,并将结果存储到另一个序列中。用于检查容器中的所有元素是否都满足条件。用于检查是否有任何元素满足给定条件。用于统计满足条件的元素个数。

2023-12-14 23:49:44 161

原创 如何使用std::function 和std::bind取代继承

这样做可以减少代码的复杂性,提高代码的可读性和可重用性。然而,在某些情况下,继承仍然是合适的选择,特别是当需要建立明确的关系和多态行为时,继承仍然是强大且有用的工具。来实现多态行为、模块化代码、代码重用和面向接口编程的情况。通过利用函数指针和绑定器,我们可以灵活地组合和调用不同的函数或函数对象,而无需依赖继承关系。继承是面向对象编程中一种重要的机制,但有时候使用继承可能会导致代码变得复杂、难以理解和不易维护。可以在某些情况下替代继承,这是因为它们提供了一种更灵活和可重用的方法来实现代码的动态行为。

2023-12-13 23:58:04 159

原创 User “system:serviceaccount:xxx:default“ cannot get resource “endpoints“ in API group ““问题解决

然后执行kubectl apply -f defaultrolebinding.yaml。创建defaultrolebinding.yaml。然后重启业务pod就行。

2023-12-13 23:24:01 70

原创 could not find a ready tiller pod

是 kubelet 的一个bug,在多container pod 的情况下有可能出现(概率很小)长期来看,需要等待官方合入代码,更新版本。github 上已经有 PR,但是官方尚未合入代码。

2023-12-13 23:22:58 74

原创 kafka丢数据的原因

默认情况下,Kafka使用一种称为"consistent_random"的分区分配策略,它会根据Producer发送的消息键(如果有)进行计算,以确保具有相同键的消息被分配到同一个分区,而没有键的消息则随机分配到各个分区,当然也可以直接指定消息的分区id。需要注意的是,虽然这种情况下会在一个Broker上存在多个同一主题的分区,但Kafka仍然能够正确处理消息的存储和传递。当创建一个新的主题并指定分区数时,Kafka会根据集群中可用的Broker数量,自动将分区分配到不同的Broker上。

2023-10-26 22:27:41 1463

原创 boost::any 与 boost::any_cast

提供了一种灵活的方式来存储和检索任意类型的值,并且可以在运行时进行类型转换。它对于需要动态类型操作的情况非常有用,但需要小心使用以避免潜在的类型转换错误。可以在运行时存储和检索不同类型的值,同时保持类型安全和内存管理的正确性。这使得我们可以在不事先知道具体类型的情况下,以一种通用的方式处理各种类型的值。请注意,在实际使用时,确保对于不同类型的值有适当的处理方法,例如设置默认值、抛出异常等,以满足您的需求。用于处理类型安全的任意类型值的存储和检索。中存储的字符串,实际上是以C风格的字符串(

2023-09-05 00:19:43 310

原创 常见的可以提升编码效率的 modern C++ 语法糖【1】

在上面的示例中,我们首先定义了一个std::string类型的字符串str,然后使用std::string_view类型的view1和view2表示字符串的一部分或整个字符串。需要注意的是,std::string_view类型只是字符串的一个视图,不拥有字符串的内存,因此需要确保原始字符串的生命周期大于或等于std::string_view类型的生命周期。std::string_view是C++17标准中引入的一种轻量级字符串视图类型,可以用于表示字符串的一部分或整个字符串,而不需要进行内存分配或拷贝。

2023-08-27 15:19:38 324

原创 std::dynamic_pointer_cast转换shared_ptr

是 C++ 标准库中的一个函数模板,用于在共享指针之间进行动态类型转换。它允许将一个指向基类的。是一种安全的和方便的动态类型转换工具,可以帮助在继承层次结构中进行共享指针的类型转换。

2023-08-27 15:10:14 443

原创 enable_shared_from_this

shared_from_this()不能在构造函数里调用,因为在构造对象的时候,它还没有被交给shared_ptr接管。它提供了一种机制,使类能够安全地从成员函数内部获得指向自身的。是一个基类模板,用于解决在类成员函数中获取类对象的。下面是一个示例代码,展示了。

2023-08-27 15:08:01 934

原创 weak_ptr是怎么探知对象生死的

是C++智能指针中的一种。它用于解决共享所有权的问题,并且可以避免因循环引用而导致的内存泄漏。来探知对象是否存活,并避免悬空指针的风险。并不会增加计数器来计算对象的引用次数。存在,也无法访问对象。为了判断对象是否仍然存在,如果对象已经被释放,则返回一个空的。提供了一个方法来检查其所指向的对象是否有效。,以确保对象在使用期间不会被意外释放。本身并不承担对象的所有权,它指向由。管理一个整数对象,并通过。释放后,即使还有相关的。在上述示例中,我们使用。在上述示例中,我们通过。,否则返回一个有效的。

2023-08-27 15:06:37 208

原创 【Kafka】自动提交偏移量和手动提交偏移量的区别

如果您的应用程序对消息处理的准确性和可靠性要求较高,或者需要更精细的控制以避免重复消费或消息丢失,那么手动提交偏移量可能更适合。否则,自动提交偏移量可以提供一种简化的方式来管理偏移量,尤其在简单的消费者应用中很常见。总而言之,手动提交偏移量可能会稍微影响性能,但仍然取决于具体的使用情况和配置。此外,可以通过调整参数来改善性能,例如增加自动提交的间隔时间、批量提交偏移量等。手动提交偏移量与自动提交偏移量在性能方面可能存在一些差异,但这取决于具体的使用情况和配置。在上述示例中,通过将。在上述示例中,通过将。

2023-07-23 23:51:01 1360

原创 【Kafka】常用操作

如果您的应用程序对消息处理的准确性和可靠性要求较高,或者需要更精细的控制以避免重复消费或消息丢失,那么手动提交偏移量可能更适合。因此,在大多数情况下,为了实现负载均衡、容错和提高处理能力,您应该指定消费者组,尤其是在需要同时处理大量消息或要求高可用性的场景中。在Kafka中,消费者组是一组消费者的逻辑名称,它们共同协作来消费一个或多个主题中的消息。需要注意的是,如果您没有为消费者指定消费者组,则它将成为一个独立的消费者。它将消息发布到指定的主题,可以按照自定义的逻辑生成消息,并决定消息发送的频率和顺序。

2023-07-23 23:50:12 1580

原创 C++链表并行排序实现(利用std::future)

除了使用std::async外,可以自己实现一下spawn_task函数,包装下std::packaged_task和std::thread。注意,一旦线程库判断任务过多,std::async()的实现可能并不是在新线程上操作,而是按照同步方式生成新任务,从而减小开销。代码中,链表的前半部分的排序不再由当前线程执行,而是通过std::async()在另一个线程上操作。std::partition操作耗时比较长,它是串行调用的,所以上述代码仍然有上升空间。可以更清晰地表达函数对象的返回类型,避免了使用。

2023-06-17 23:33:21 182

原创 利用etcd实现分布式锁

在python中已经自带了分布式锁的实现方式,下面我们尝试一下加锁与解锁的流程在运行该demo同时也对lock对应的key进行watch,观察其变化,注意python-etcd3在实现分布式锁的时候,采用的key需要加上prefix:在这里插入图片描述结果如下:当获取到锁的时候value改变,当release的时候锁value为空,此时cancel掉对当前key的watch。

2023-06-14 17:20:50 1457

原创 etcd基本使用

我们这里开一个进程watch某一个key,在另外一个进程里进行替换或者删除key。很显然,如果我们在主线程进行event监控,会造成主线程阻塞。我们可以向watch加入回调函数,这样就不会阻塞主进程了。当我们不想继续watch后,我们可以显式取消watch。我们可以使用watch_once在第一个事件后停止。可以看到在接收到事件后watch进程仍在监听状态。这里我们在第3次处理watch事件后进行取消。

2023-06-14 12:09:22 1598

原创 实现线程安全的队列

使用了互斥量和条件变量来保证线程安全。中推入了 10 个整数,每个整数之间间隔 100 毫秒。假设我们忽略构造、赋值、互换、拷贝,那么只剩下3组操作。中取出了 10 个整数,并输出了每个整数的值。2:front、back,用于查询队列中的元素。在这个示例代码中,我们定义了一个生产者函数。中推入数据和从中取出数据。,并在两个线程中分别调用。

2023-06-13 15:42:00 2012

原创 递归加锁std::recursive_mutex使用

c++标准库为此提供了std::recursive_mutex,其工作方式与mutex类似,不同的是,其允许同一线程对某互斥的同一个实例多次加锁。是一个递归互斥量,它允许同一个线程多次对它进行加锁操作,而不会导致死锁。最后,线程会输出一条信息表示线程已经释放了互斥量,并解锁。有些场景中,我们需要让线程在同一互斥上多次重复加锁,而无需解锁。,然后输出一条信息表示线程已经锁定了互斥量。时,需要注意避免死锁和竞争条件的问题。的值大于 1,线程会递归地调用。,它会递归地调用自己,直到。

2023-06-12 22:46:01 448

原创 C++实现层级互斥锁

层级互斥锁实现

2023-06-12 11:34:43 440

原创 C++简单实现hash_table

对外提供insert find remove接口。使用拉链法解决hash 冲突。

2023-06-09 15:22:45 102

原创 vector的简单实现

emplace_back函数可以用于在vector的末尾直接构造一个元素,而不需要先创建一个临时对象再将其拷贝或移动到vector中。这个实现使用了 C++11 中的变长模板参数和完美转发,可以接受任意数量和类型的参数,并将它们转发给。的大小,并使用了移动构造和拷贝构造函数来实现对象的拷贝和移动。的末尾直接构造一个元素,而不需要先创建一个临时对象再将其拷贝或移动到。类的实现可以正确地处理对象的拷贝和移动,并且可以动态调整。对象,并测试了它们的各种函数。在这个实现中,我们使用了完美转发来将。

2023-06-07 23:54:13 541

原创 Call to deleted constructor of ‘std::thread‘ ‘thread‘

第一个代码返回的是一个引用,意味着返回的是 t 对象本身,而不是 t 对象的副本。第二个代码返回的是一个值,意味着返回的是 t 对象的副本。std::thread 类型的对象是不可拷贝的,不能通过值返回的方式来返回一个 std::thread 类型的对象。在std::thread中,它的拷贝构造、拷贝赋值操作符都被声明为delete,所以是不可复制的,不然会产生一些无法预料的错误。第一个代码返回的是一个 std::thread& 类型的引用,而第二个代码返回的是一个 std::thread 类型的值。

2023-06-06 17:21:02 414

原创 shared_ptr的简单实现

shared_ptr是一种非常实用的智能指针,它可以在多个指针之间共享同一个对象,从而避免了内存泄漏和野指针的问题。变量可以被多个变量共享,但是这种共享方式是基于静态存储期的,而不是基于动态存储期的。是 C++11 中引入的一种智能指针,它可以在多个指针之间共享同一个对象,从而避免了内存泄漏和野指针的问题。变量来记录引用计数无法实现动态存储期的共享,从而导致引用计数的不准确和内存泄漏的问题。的值为 0,则表示没有任何指针指向该对象,此时会自动释放该对象的内存空间。时,我们需要的是动态存储期的共享,即多个。

2023-06-06 12:46:29 1144 2

原创 std::forward_list与std::advance使用

是一个非常实用的算法函数,它可以帮助我们在迭代器中快速移动指定的距离,非常适合于需要在迭代器中进行随机访问的场景。但是,由于它可能会导致迭代器越界,因此在使用时需要格外小心,避免出现不必要的错误。是 C++ STL 中的一个算法函数,它可以将迭代器向前或向后移动指定的距离。的用法非常简单,它接受两个参数:一个迭代器和一个整数值,表示要移动的距离。的用法与其他 STL 容器类似,可以使用迭代器来遍历和操作容器中的元素。的绝对值大于迭代器中剩余的元素个数,那么行为是未定义的。表示要移动的迭代器,

2023-05-23 12:32:42 572

原创 std::inner_product与std::accumulate初始值设置踩坑

std::transform_reduce函数:在计算序列的变换和缩减时,初始值的类型应该与变换和缩减函数的返回类型相同,否则可能会导致类型转换错误或精度损失。std::partial_sum函数:在计算序列的部分和时,初始值的类型应该与序列的元素类型相同,否则可能会导致类型转换错误或精度损失。std::reduce函数:在计算序列的缩减时,初始值的类型应该与缩减函数的返回类型相同,否则可能会导致类型转换错误或精度损失。函数将对两个源序列中的每个元素进行乘法运算,并将结果累加到初始值中,最终返回累加结果。

2023-04-12 23:57:43 669

原创 【C++】std::transform、std::back_inserter使用

std::transform函数可以用于对一个序列中的每个元素进行转换,并将结果存储到另一个序列中。std::back_inserter是一个迭代器适配器,可以将元素插入到容器的末尾

2023-04-12 23:40:25 701

原创 Python常见装饰器使用(实用向)

Python 中有很多好用的装饰器,这里简单介绍8个实用的装饰器辅助代码更加pythonic

2023-04-09 20:09:35 2059

原创 【Python】@cache装饰器使用 (依赖cachetools)

cachetools是一个 Python 缓存库,可以用于缓存函数的计算结果,以提高程序的性能和响应速度。使用cachetools可以避免重复计算、减少网络请求、降低数据库负载等问题,从而提高程序的效率和可靠性。cachetools的使用条件是函数的计算结果具有可重复性,即对于相同的输入参数,函数的输出结果始终相同。此外,cachetools还需要一些额外的配置参数,例如缓存的最大大小、缓存的过期时间等。使用cachetools。

2023-04-09 18:30:16 947

原创 __builtin_xxx指令学习【5】__builtin_bswap16/32/64

__builtin_bswap16/32/64是GCC和Clang编译器提供的内置函数,用于交换一个整数的字节顺序。其中,__builtin_bswap16用于交换一个16位整数的字节顺序,__builtin_bswap32用于交换一个32位整数的字节顺序,__builtin_bswap64用于交换一个64位整数的字节顺序。这些函数的使用背景是在一些网络编程和底层编程中,需要对字节序进行处理和转换,而交换字节顺序是一个常见的操作

2023-04-08 17:33:16 2070

原创 __builtin_xxx指令学习【3】__builtin_popcount & __builtin_popcountll

__builtin_popcount是GCC和Clang编译器提供的一个内置函数,用于计算一个整数中二进制位为1的个数。该函数的使用背景是在一些位运算和计算机视觉等领域中,需要对二进制数据进行处理和分析

2023-04-08 17:30:23 742

原创 __builtin_xxx指令学习【4】__builtin_clz&__builtin_ctz & __builtin_clzll & __builtin_ctzll

__builtin_clz是GCC和Clang编译器提供的一个内置函数,用于计算一个整数的二进制表示中,从最高位开始连续的0的个数。该函数的使用背景是在一些位运算和计算机视觉等领域中,需要对二进制数据进行处理和分析。

2023-04-08 17:29:15 2542

原创 __builtin_xxx指令学习【2】__builtin_prefetch

__builtin_prefetch是GCC编译器提供的一个内置函数,用于预取数据到CPU的缓存中,以便提高程序的执行效率

2023-04-08 17:25:47 1731

原创 __builtin_xxx指令学习【1】__builtin_expect

__builtin_expect是GCC编译器提供的一个内置函数,用于告诉编译器一个分支的执行概率,以便编译器在生成机器码时进行优化。

2023-04-08 16:47:06 732

原创 std::set_difference用法

其中,first1 和 last1 表示第一个有序范围的起始和结束迭代器,first2 和 last2 表示第二个有序范围的起始和结束迭代器,d_first 表示结果范围的起始迭代器。std::set_difference 是 C++ STL 中的一个算法,用于计算两个有序范围之间的差集,并将结果存储到另一个有序范围中。需要注意的是,输入范围必须是有序的,否则 std::set_difference 算法的行为是未定义的。另外,结果范围必须足够大,以容纳所有的差集元素。

2023-04-06 22:14:00 843

原创 c++中以类对象作为key用于unordered_map、map,以及std::tie技巧使用

在这个例子中,std::tie 函数将 country_id、province_id 和 isp_id 绑定在一起,形成一个元组。当比较多个成员变量时,可以使用 std::tie 函数来简化比较操作。std::tie 函数可以将多个变量绑定在一起,形成一个元组,然后使用元组的比较操作符进行比较。需要注意的是结构体的成员变量应该是不可变的,以避免在哈希表or红黑树中修改键值对。如果在哈希表or红黑树中修改键值对,将会导致哈希表or红黑树的内部结构被破坏,从而导致未定义的行为。

2023-04-06 21:14:55 795

机器学习——神经网络参数的反向传播.pdf

本人通过观看吴恩达机器学习视频所记录的笔记,比较潦草,有兴趣的可以看一看。 知识点概要: 1、代价函数 2、反向传播算法 3、理解反向传播 4、展开参数 5、梯度检测 6、随机初始化 7、总结

2020-03-30

机器学习——神经网络(前向传播).pdf

本人通过观看吴恩达机器学习视频所记录的笔记,比较潦草,有兴趣的可以看一看。 知识点概要: 1、非线性假设 2、神经元与大脑 3、模型的展示 4、简单例子讲解 5、多元分类

2020-03-28

机器学习——正则化.pdf

本人通过观看吴恩达机器学习视频所记录的笔记,比较潦草,有兴趣的可以看一看。 知识点概要: 1、过拟合问题 2、代价函数 3、线性回归的正则化 4、逻辑回归的正则化

2020-03-28

机器学习——Logistic回归.pdf

本人通过观看吴恩达机器学习视频所记录的笔记,比较潦草,有兴趣的可以看一看。 知识点概要: 1、分类 2、假设陈述 3、决策界限 4、代价函数 5、简化代价函数 6、多元分类

2020-03-28

机器学习——多变量线性回归.pdf

本人通过观看吴恩达机器学习视频所记录的笔记,比较潦草,有兴趣的可以看一看。 知识点概要: 1、多元梯度下降法 2、特征与多项式回归 3、正规方程 4、正规方程在矩阵不可逆的情况下的解法 5、编程技巧

2020-03-28

机器学习——单变量线性回归.pdf

本人通过观看吴恩达机器学习视频所记录的笔记,比较潦草,有兴趣的可以看一看。 知识点概要: 1、假设函数 2、代价函数 3、梯度下降法 4、如何选择学习率 5、关于线性回归的梯度下降

2020-03-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除