自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 收藏
  • 关注

原创 爬楼梯和打家劫舍问题总结——递归和动态规划思路对比分析

本文介绍了动态规划(DP)算法在爬楼梯和打家劫舍两个经典问题中的应用。针对爬楼梯问题,展示了递归(未优化/优化)和DP(空间O(n)/O(1))四种解法;针对打家劫舍问题,同样给出了递归和DP的四种实现方案。文章指出递归和DP本质上思路相同,只是实现方式不同:递归利用函数调用栈隐式保存中间结果,而DP显式存储并使用循环。通过对比分析,建议实际开发中优先选择DP方法以避免递归深度过大,并特别介绍了通过滚动变量优化空间复杂度的技巧。这两个问题分别体现了动态规划在计数和加权求和场景中的应用。

2025-10-09 17:36:51 395

原创 C++ 20 视图view笔记

C++20引入的视图(View)是范围库的核心组件,提供了一种轻量级、非拥有且延迟计算的数据处理方式。视图不持有底层数据,仅通过迭代器引用原始序列,构造开销极低。其关键特性包括:延迟计算(操作按需执行)、可组合性(适配器可通过管道符连接)和高效性(避免不必要的内存分配)。常见视图适配器如filter、transform、take等能实现复杂的数据处理链。但需注意视图仅引用数据,必须确保底层数据生命周期长于视图,且转换函数应保持无状态以避免副作用。视图机制为现代C++提供了声明式的高性能数据处理能力。

2025-09-09 11:14:52 664

原创 Linux control group笔记

本文介绍了Linux CGroup(Control Groups)的核心概念和操作方法。CGroup是Linux内核功能,用于限制、记录和隔离进程组的系统资源使用。文章详细讲解了CGroup的两个版本(v1和v2)、核心组件(子系统、控制组、层级结构等),以及两种管理方式:通过虚拟文件系统手动操作和使用命令行工具。提供了常用命令示例和C++ API调用方法,演示了如何将进程添加到指定CGroup。最后强调了操作时的注意事项,包括权限问题、版本差异和系统服务管理等。CGroup是Linux系统资源管理的重要工

2025-09-08 11:09:28 930

原创 Linux namepace 笔记

Linux Namespace 摘要 Namespace 是 Linux 内核提供的资源隔离机制,使不同进程组拥有独立的系统资源视图(如进程ID、网络、文件系统等),从而实现轻量级虚拟化。它是容器技术(如 Docker)的核心基础,与 cgroups 配合实现资源隔离与限制。 主要类型: PID(进程隔离)、Network(网络栈隔离)、Mount(文件系统隔离) UTS(主机名隔离)、IPC(进程通信隔离)、User(用户权限隔离) 关键特性: 通过 clone()、unshare() 等系统调用动态创建

2025-09-08 10:25:04 739

原创 YAML格式笔记

YAML(YAML Ain't Markup Language)是一种以数据为中心、易读易写的配置语言,广泛应用于配置文件和数据序列化。其核心特点包括:使用缩进表示层级(仅空格)、大小写敏感、支持注释(#)。主要数据结构为对象(键值对)、数组(-开头)和标量(字符串/数字等)。支持多行字符串、锚点复用(&和*)、多文档分隔(---)等高级特性。最佳实践建议使用空格缩进、保持格式一致,避免敏感信息直接写入,并善用多行字符串和锚点功能简化配置。YAML因其出色的可读性已成为现代开发中配置文件的标准格式。

2025-08-20 18:49:00 733

原创 ROS 2系统Callback Group概念笔记

ROS 2中的回调组(Callback Group)是管理回调函数执行规则的容器,决定回调函数是并行还是串行执行。它解决了多个回调函数相互干扰的问题,如高频数据处理阻塞其他回调。ROS 2提供两种回调组类型:互斥型(默认,串行执行)和可重入型(并行执行,需确保线程安全)。使用时需在创建订阅者/定时器等对象时指定所属回调组,并与执行器(SingleThreaded/MultiThreadedExecutor)配合使用。回调组是优化节点响应性和性能的重要工具,合理使用可避免不必要阻塞。

2025-08-20 17:00:46 961

原创 ROS2 cpp程序的基本要素和编译、执行

本文介绍了ROS2功能包的创建与开发流程。通过ros2 pkg create命令创建CMake项目,在src目录下编写节点类(继承自rclcpp::Node),实现海龟模拟器的控制逻辑。文章详细说明了package.xml和CMakeLists.txt的配置要点,包括依赖声明、可执行文件生成等。示例代码展示了如何订阅海龟位姿并发布控制指令,其中重点说明了日志系统的使用方式(节点内部使用get_logger(),全局函数需传入日志标签)。最后给出了从编译(colcon build)到运行(ros2 run)的

2025-08-15 17:15:18 367

原创 libcppjson使用示例

本文介绍了使用 libjsoncpp 库解析 JSON 字符串的两种场景。第一部分演示了如何解析包含嵌套结构的 JSON 对象,包括基本类型、数组和嵌套对象的访问方法。第二部分专门讲解了仅包含数组的 JSON 字符串的解析技巧,包括数组类型检查和遍历方法。文章提供了完整的代码示例,涵盖了 JSON 解析、数据访问、错误处理等关键操作,并说明了编译时需要的链接选项。这些方法适用于大多数 C++ 项目中处理 JSON 数据的需求。

2025-08-01 16:04:44 406

原创 redis一篇入门

Redis 安装与使用指南摘要 Redis是一款高性能内存数据库,支持多种数据结构。本文介绍了Redis的安装配置、基本使用和高级特性: 安装:提供Linux通过包管理或源码编译安装方法,Windows用户可通过WSL或Docker使用。 配置:详解主要配置项如绑定IP、持久化设置、内存管理和密码保护,需重启服务生效。 基本操作:涵盖字符串、哈希、列表等数据结构操作,以及连接方式和持久化命令。 高级特性:包括事务处理、发布订阅模式、Lua脚本支持等高级功能。 性能管理:提供性能测试工具、服务器信息查看和安全

2025-07-07 14:53:11 879

原创 C++23 的显式 this 参数(explicit object parameter)

C++23的显式this参数特性允许将this指针作为显式参数传递,提供了更灵活的成员函数设计方式。该特性支持统一成员函数和自由函数调用语法、明确选择值/引用语义、完美转发、简化CRTP模式,以及在静态函数中访问对象。通过将this作为显式参数(如void foo(this S& self)),开发者可以获得更精确的控制,改进模板设计,并实现更一致的面向对象编程体验。语法要求显式this必须是第一个参数,适用于C++23及以上编译器(如GCC13+)。这项特性提升了代码表达能力和设计灵活性。

2025-06-26 15:59:09 708

原创 /proc/<pid>/maps文件格式详解

摘要:/proc/<pid>/maps文件详细展示进程的虚拟内存布局,包含代码段、堆、栈等区域的地址范围、权限和映射来源。每行有6个字段:地址范围、权限标志(rwxp/s)、文件偏移、设备号、inode号和路径名。特殊标记如[heap]、[stack]标识关键内存区域。通过分析权限(r--p、rw-p等)可判断区域用途,如可执行代码或读写数据。工具如grep、pmap可辅助分析内存占用。该文件是诊断内存泄漏、分析进程行为的重要工具,需重点关注匿名映射和特殊内核区域。

2025-06-12 19:17:52 609

原创 编译时计算静态数组大小技巧

这段代码展示了一种经典的C++模板技巧,用于在编译时计算静态数组的大小。通过函数模板ArraySizeHelper对数组类型进行推导,返回一个与数组维度相关的引用类型,结合sizeof运算符实现安全的数组元素计数。相比传统的sizeof(arr)/sizeof(arr[0])方法,该方案具有更好的类型安全性,能防止指针误用。虽然在现代C++中可用constexpr或std::array替代,但这个模板技巧在C++03时代是重要的编译时计算方法,体现了模板元编程的巧妙设计。

2025-06-10 17:24:00 239

原创 为什么C++只能通过指针或引用来使用(动态)多态?

摘要:C++中只有通过指针或引用才能实现运行时多态,主要原因包括:1) 虚函数表机制需要间接寻址;2) 值传递会导致对象切片,丢失派生类信息;3) 指针/引用能区分静态和动态类型。直接访问对象会引发静态绑定,而指针/引用通过vptr实现动态绑定。这种设计体现了C++对性能与灵活性的权衡,要求开发者显式选择多态行为。(149字)

2025-06-03 11:29:21 222

原创 C++可变参数宏定义语法笔记

本文介绍了C/C++中可变参数宏的使用方法。首先,基础语法通过__VA_ARGS__展开可变参数,并展示了如何定义和使用宏。其次,针对空可变参数可能导致语法错误的问题,提出了使用##__VA_ARGS__来优化,避免尾随逗号。接着,介绍了C++20引入的__VA_OPT__,用于更灵活地控制可变参数的展开。文章还提供了多个示例,如调试日志、泛型包装和条件编译,展示了可变参数宏的实际应用。最后,总结了使用时的注意事项,包括参数中的逗号处理、兼容性问题以及避免副作用。通过这些内容,读者可以更好地理解和应用可变参

2025-05-23 16:22:38 597

原创 关于创建UNIX/Linux daemon进程的笔记

(1) 上述几个步骤的目的是让进程脱离原session和terminal终端。(2) 第一个fork是为调用setsid做准备,创建新session,脱离原session。副作用:成为session和进程组长。(3)第二次fork是为了消除第二部副作用,不再是组长,不能获得terminal终端。

2025-04-22 11:37:28 603

原创 bash中如何区分系统命令和自定义函数

type 显示命令的类型(系统命令、函数、别名等) 通用检查。declare -F 检查函数是否已定义 判断函数是否存在。declare -f 列出或显示函数的定义 检查函数定义。command -v 显示命令的路径或名称 简洁检查。compgen 列出所有命令、别名、函数等 批量检查。系统命令:输出命令的路径(例如 /bin/ls)。通过以上方法,可以轻松区分系统命令和自定义函数。which 查找系统命令的路径 仅检查系统命令。函数:输出函数名(例如 myfunc)。方法 功能 适用场景。

2025-03-21 11:42:50 537

原创 Android/AOSP源码编译错误:TEMPORARY_DISABLE_PATH_RESTRICTIONS

分析操作流程,在同一个编译环境中,连续编译不同版本的Android源码(Android 11和Android 12),由于不同版本源码编译时设置不同的环境变量,并且不同版本源码对环境变量的检查条件不兼容导致的。,在Android12编译时,不兼容这个变量的设置,并且编译脚本不会取消这个变量,导致编译报错。具体到遇到的这个问题,在Android11上编译是,配置脚本设置。编译环境多次编译过源码,工具链等都是正确配置,不存在问题。取消次环境变量设置,再次编译源码,可正常编译。

2025-03-13 14:11:23 530

原创 Ubuntu上用adb连接Android提示无权限(no permissions (missing udev rules? user is in the plugdev group))

需要配置udev rule,在/etc/udev/rules.d/下创建对应的rule文件。重新插拔设备连接到PC上的USB线即可。

2025-03-11 13:39:59 716

原创 sudo免密码

Ubuntu上执行需要root权限的命令需要使用sudo命令,默认每次都需要输入密码进行授权。可以通过配置sudoer把用户添加到白名单中,执行sudo命令是不需要输入密码验证。

2025-03-10 10:42:47 345

原创 随机过程和马尔科夫过程

随机过程是一族随机变量 {X(t),t∈T}{X(t),t∈T},其中 TT 是参数集(通常是时间或空间),X(t)X(t) 是在每个时刻或位置 tt 的随机变量。例如,股票价格随时间的变化、天气温度的变化、电话呼叫的到达时间等都可以用随机过程来描述。随机过程 {Xn,n=0,1,2,… }{Xn​,n=0,1,2,…状态空间:S={s1,s2,… }S={s1​,s2​,…}(可以是有限或无限的)。转移概率。

2025-02-24 14:28:13 1161

原创 vs code配置Android native开发的include path

编辑settings.json(Ctrl + ,或者直接打开如下配置文件,在vs code的界面上只能逐项添加)为了方便修改,可以添加自动以变量,定义android源码的根目录,如果切换源码目录,只需要修改这个变量即可。修改属性:C_Cpp.default.includePath,追加include path。

2024-12-24 14:28:54 570

原创 leetcode:删除链表中倒数第N个节点

【代码】leetcode:删除链表中倒数第N个节点。

2024-12-17 17:13:48 130

原创 Android源码编译命令 m/mm/mmm/hmm

【代码】Android源码编译命令 m/mm/mmm/hmm。

2024-10-21 15:10:42 351

原创 记录一个Android编译中遇到的(有点)奇怪的问题vendor_available

这几个xml是对应工程中hal接口描述文件(学名叫兼容矩阵compatibility matrix,这里不展开),根据.bp文件中的配置vendor是否可用,选择是否在vendor目录下放置此文件。把上述几个.xml文件删除,重新make就可以正常编译通过。此时单独编译工程,使用mm或者mmm命令,可以正常编译。Android源码已经完整编译过。

2024-09-13 11:12:56 967

原创 DDS笔记: hello world解析

获取DomainParticipantFactory -> 创建participant -> 注册sub-pub type -> 创建topic(顺序可延后) -> 创建publisher / subscriber -> 创建writer / reader -> write / read / WaitSet.wait。创建subscriber时传入listener参数,通过listener回调事件和数据(on_subscription_matched, on_data_available)。

2024-08-18 14:47:03 444

原创 Android.bp编译报错

确认可用类型,查找编译目录,找到以下几种平台类型的静态库。前面几种arm类型的都能对应上,x86平台的只编译出来linux_glibc_x86_64_static版本,这个是和当前PC编译环境对应的,其他3中x86类型缺失是由于当前环境下不具备编译条件。这个例子中发现缺少:image:vendor.30。可以通过libc++fs库对应的.bp文件进行确认。同时,提示当前可用版本类型(available variants),每行是一个类型。把“期望类型”和“已有类型”对比差异,逐个字段比较,看缺少哪项。

2024-07-23 17:37:44 2783

原创 Android Hal service compatibility matrix

编译后文件保存的位置:(/etc —> /system/etc)2)在Android.bp中增加对应的编译选项。

2024-04-07 13:31:47 1096

原创 JetBrains全家桶vmoptions配置文件(Ubuntu)

【代码】JetBrains全家桶vmoptions配置文件(Ubuntu)

2024-03-26 09:25:14 2200

原创 Linux socket: udp server and client demo

(2)收到client请求后,在server fd上调用accept获得client fd,client sockaddr_in对象。1)创建socket,指定协议版本(v4,v6)、协议类型(udp、tcp),获得server fd。(3)bind和connect入参相同,server fd, addr, addr_length。server端,不指定具体的client地址,设置为INADDR_ANY。1)创建socket,指定协议版本和协议类型,获得server fd。4)接收client连接请求。

2024-01-04 15:01:55 1020

原创 c++ asio: udp server and client demo

2)receive_from可以获取到client的endpoint,也可以用这个对象给client发送数据(send_to)2)创建一个udp::endpoint对象,指定协议版本(v4,v6)和端口号,初始化socket对象。执行收发动作,socket.receive_from和socket.send_to。1)需要创建一个io_context对象,初始化socket对象。1)收发都需要一个asio::buffer缓存。创建udp::socket,用于收发数据。一、server 端。

2024-01-04 14:45:06 1190

原创 Bash script进阶笔记

3)必须提供‘下标’,下标可用数字(此时和数组类似),可以是字符串(单引号、双引号都可以)2)需要使用declare -A声明,不能像数组那样可省略declare -a。declare是bash内置命令,可为变量设置属性(值类型、访问类型等)。1)最外面是小括号(),内部元素间用空格分隔,下标用中括号[]指定。-A: associative array Map类型。-a: indexed array 数组。-x: export,导出环境变量。Map类型(关联数组)

2023-12-14 14:29:30 759

原创 Linux 网络命令:ip

ip route 查看路由表。

2023-12-04 15:27:37 794

原创 C++知识点梳理:C++ templates

这3种参数是不同维度的,尤其是类型参数和template template参数,容易混淆,在实例化时需要区分模板参数和普通类型参数,如果定义为模板参数则只能提供模板名(不能用具体类型实例化,如vector,不是vector< int >)6)匿名参数,在模板参数列表中定义匿名参数,这些参数在模板定义中没有用到,仅用于静态分发(通过类型选择不同的模板),或者为了应用SFINAE规则(阻止生成不符合某些规则的模板)。只需要类名和后面的类型说明,和定义时不同,此时需要提供具体的类型。

2023-11-17 12:43:16 639

原创 C++知识点梳理:移动语意、右值

a)传入lvalue调用,过程中分配内存2次:v->x复制一次(第一次分配内存),x move to data_由于data_内存不够大(data_默认构造的,除非v为空)需要在移动构造函数内再次分配内存(第二次分配内存)。本质上,就是这个局部变量是多余的,通过传值在函数参数初始化时创建一个临时变量(省略掉多余的局部变量),函数参数的变量名是必须有的,只是能够选择分配内存(传值、赋值)或不分配内存(传引用、右值)。如果是类成员变量,已经初始化了?b)返回值,NRVO优化,不会复制。

2023-11-13 16:40:32 229

原创 C++知识点梳理:包装类型/词汇类型 vocabulary types

2)std::get< index >(v) 通过索引检索当前保存的值,如果对应索引没有保存值,抛出异常:std::bad_variant_access。3)std::get< type >(v) 通过类型检索当前保存的值,如果对应类型没有保存值,抛出异常:std::bad_variant_access。std::get_if< index >(&v) 通过索引检索当前保存的值,如果对应索引没有保存值,返回nullptr。注意:传入指针,返回指针。注意:传入指针,返回指针。

2023-11-10 14:34:23 204

原创 Linux pipe()系统调用示例

一个pipe是单向数据传输的,不用用于父子进程双向读写。创建2个pipe实现父子进程间的双线读写。Linux系统调用pipe函数,创建一个pipe,通过传入的fd数组返回pipe的读、写两端。其中fd[ 0 ]用于读,fd[ 1 ]用于写。

2023-11-08 17:56:12 398

原创 Rust笔记【3】

Deref 强制转换可以将&String 转换为&str,因为String 实现了Deref trait 因此可以返回&str。Deref 强制转换(deref coercions)将实现了Deref trait 的类型的引用转换为另一种类型的引用。• 当T: DerefMut<Target=U> 时从&mut T 到&mut U。• 当T: Deref<Target=U> 时从&mut T 到&U。• 当T: Deref<Target=U> 时从&T 到&U。2)移动大量数据,避免赋值。

2023-11-07 15:43:01 180

原创 Rust笔记【2】

(3)如果定义中没有使用到lifetime参数,可使用匿名lifetime:'_ ,如下面的read()方法。(2)输出lifetime可自动推导的情况:唯一输入lifetime和方法&self的lifetime。语法示例,lifetime在函数、struct的语境中作为泛型参数使用,无法单独使用。(1)struct中有引用类型,就需要声明lifetime参数。(1)泛型参数列表中,lifetime在typename之前。适配器是惰性的,需要调用消费适配器的方法,才会实际执行。函数中的lifetime。

2023-11-01 09:23:22 433

原创 Rust笔记【1】

注意:作用域结束不是以大括号结束,是以变量最后一次使用结束变量作用域(是没有显式标志)。1)为所有情况单独处理每个分支,例如enum类型。Rust中match匹配必须是穷尽的。字符串slice类型声明:&str。2)使用通配模式,用到匹配的值。字符串字面值是slice。

2023-10-24 14:49:44 439

原创 git patch创建和应用

【代码】git patch创建和应用。

2023-10-11 17:59:14 495

数据结构知识梳理汇总文档

大家都知道数据结构是开发的基础,也是提升水平的必经之路。文档梳理了数据结构的知识体系。数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。

2023-01-09

全面的Android view相关知识汇总整理

Android应用开发中View是基本的概念之一,也是应用开发最基础的构件。由于界面控件都是基于View扩展出来的,形成了复杂的技术体系,不理解这些概念、原理,就不可能开发出稳定、性能优化的应用。这些知识也是高级、资深工程师的必备知识基础。这也是在面试中逢考必问的知识点。文档中最近了View相关的技术知识点,既可以作为平时开发时的参考,也可以作为准备面试的知识提纲,帮助自己快速建立知识体系。

2023-01-09

Android面试必备参考提纲(2022)

提纲内容涵盖网络传输、Framework开发、设计模式等多方面,较为前面的整理了面试中可能遇到的各类问题,让面试准备更系统化,节省时间。内容全面,贴近实战,在开发中参考用来提升个人能力也是非常好的选择。

2023-01-07

空空如也

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

TA关注的人

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