自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java String字符串处理

字符串比较是常见的操作,包括比较相等、比较大小、比较前缀和后缀串等。字符串中存在的首尾空格一般情况下都没有任何意义,如字符串“ Hello ”,但是这些空格会影响到字符串的操作,如连接字符串或比较字符串等,所以应该去掉字符串中的首尾空格,这需要使用 String 类提供的 trim() 方法。这里需要特别注意的是, 对于开始位置 beginIndex, Java 是基于字符串的首字符索引为 0 处理的,但是对于结束位置 endIndex,Java 是基于字符串的首字符索引为 1 来处理的,如图 1 所示。

2022-10-16 22:16:02 367 1

原创 在C++程序中调用被C编译器编译后的函数,为什么要加extern “C“

C++语言支持函数重载,C语言不支持函数重载,函数被C++编译器编译后在库中的名字与C语言不同,假设某个函数原型为:void foo(int x,int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字,为了解决此类名字匹配的问题,C++提供了C链接库交换指定符号extern “C”...

2022-04-02 09:38:49 922

原创 C++内存管理

C++内存分区:栈、堆、全局/静态存储区、常量存储区、代码区。栈:存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放。堆:动态申请的内存空间,就是由 malloc 分配的内存块,由程序员控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。全局区/静态存储区(.bss 段和 .data 段):存放全局变量和静态变量,程序运行结束操作系统自动释放,在 C 语言中,未初始化的放在 .bss 段中,初始化的放在 .data 段中,C++ 中不再区分了。常量存储区(.data 段

2022-04-02 08:52:12 209

转载 C++11完美转发及其实现

首先解释一下什么是完美转发,它指的是函数模板可以将自己的参数“完美”地转发给内部调用的其它函数。所谓完美,即不仅能准确地转发参数的值,还能保证被转发参数的左、右值属性不变。举个例子:template<typename T>void function(T t) { otherdef(t);}如上所示,function() 函数模板中调用了 otherdef() 函数。在此基础上,完美转发指的是:如果 function() 函数接收到的参数 t 为左值,那么该函数传递给 othe

2022-03-06 22:27:42 239

转载 C++11引用限定符的用法

**默认情况下,对于类中用 public 修饰的成员函数,既可以被左值对象调用,也可以被右值对象调用。**举个例子:#include <iostream>using namespace std;class demo {public: demo(int num):num(num){} int get_num(){ return this->num; }private: int num;};int main() { demo

2022-03-06 22:00:20 103

转载 C++11 move()函数:将左值强制转换为右值

C++11 标准中借助右值引用可以为指定类添加移动构造函数,这样当使用该类的右值对象(可以理解为临时对象)初始化同类对象时,编译器会优先选择移动构造函数。注意,移动构造函数的调用时机是:用同类的右值对象初始化新对象。那么,用当前类的左值对象(有名称,能获取其存储地址的实例对象)初始化同类对象时,是否就无法调用移动构造函数了呢?当然不是,C++11 标准中已经给出了解决方案,即调用 move() 函数。move 本意为 “移动”,但该函数并不能移动任何数据,它的功能很简单,就是将某个左值强制转化为右值。

2022-03-06 21:28:48 102

转载 C++11移动构造函数的功能和用法

C++11移动语义是什么在 C++ 11 标准之前(C++ 98/03 标准中),如果想用其它对象初始化一个同类的新对象,只能借助类中的复制(拷贝)构造函数。拷贝构造函数的实现原理很简单,就是为新对象复制一份和其它对象一模一样的数据。需要注意的是,当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝(而非浅拷贝)的方式复制该指针成员。#include <iostream>using namespace std;class demo{public: demo():num

2022-03-06 20:02:31 822 1

转载 C++11右值引用

C++左值和右值右值引用可以从字面意思上理解,指的是以引用传递(而非值传递)的方式使用 C++ 右值。在 C++ 或者 C 语言中,一个表达式(可以是字面量、变量、对象、函数的返回值等)根据其使用场景不同,分为左值表达式和右值表达式。确切的说 C++ 中左值和右值的概念是从 C 语言继承过来的。值得一提的是,左值的英文简写为“lvalue”,右值的英文简写为“rvalue”。很多人认为它们分别是"left value"、“right value” 的缩写,其实不然。lvalue 是“loactor

2022-03-06 19:02:47 66

转载 C++11 constexpr:验证是否为常量表达式及与const的区别

constexpr 是 C++ 11 标准新引入的关键字,不过在讲解其具体用法和功能之前,读者需要先搞清楚 C++ 常量表达式的含义。所谓常量表达式,指的就是由多个(≥1)常量组成的表达式。换句话说,如果表达式中的成员都是常量,那么该表达式就是一个常量表达式。这也意味着,常量表达式一旦确定,其值将无法修改。实际开发中,我们经常会用到常量表达式。以定义数组为例,数组的长度就必须是一个常量表达式:// 1)int url[10];//正确// 2)int url[6 + 4];//正确// 3)

2022-03-06 12:48:59 126

转载 C++11非受限联合体(union)

在 C/C++ 中,联合体(Union)是一种构造数据类型。在一个联合体内,我们可以定义多个不同类型的成员,这些成员将会共享同一块内存空间。老版本的 C++ 为了和C语言保持兼容,对联合体的数据成员的类型进行了很大程度的限制,这些限制在今天看来并没有必要,因此 C++11 取消了这些限制。C++11 标准规定,任何非引用类型都可以成为联合体的数据成员,这种联合体也被称为非受限联合体。例如:class Student{public: Student(bool g, int a): gender(

2022-03-06 10:43:26 131

转载 C++11 tuple元组详解

C++11 标准新引入了一种类模板,命名为 tuple(中文可直译为元组)。tuple 最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。tuple 的应用场景很广泛,例如当需要存储多个不同类型的元素时,可以使用 tuple;当函数需要返回多个数据时,可以将这些数据存储在 tuple 中,函数只需返回一个 tuple 对象即可。tuple对象的创建tuple 本质是一个以可变模板参数定义的类模板,它定义在 头文件并位于 std 命名空间中。因此要想使用 tuple 类模板,程序中需要首先引

2022-03-05 21:16:46 1250

转载 C++11在函数模板和类模板中使用可变参数

参考文献1、http://c.biancheng.net/view/vip_8692.html所谓可变参数,指的是参数的个数和类型都可以是任意的。对于函数参数而言,C++ 一直都支持为函数设置可变参数,最典型的代表就是 printf() 函数,它的语法格式为:int printf ( const char * format, ... );…就表示的是可变参数,即 printf() 函数可以接收任意个参数,且各个参数的类型可以不同,例如:printf("%d", 10);printf("%d

2022-03-05 14:44:09 806

转载 C++11支持函数模板的默认模板参数

参考文献1、http://c.biancheng.net/view/3734.html在 C++98/03 标准中,类模板可以有默认的模板参数,如下:template <typename T, typename U = int, U N = 0>struct Foo{ // ...};但是却不支持函数的默认模板参数:template <typename T = int> // error in C++98/03: default template argu

2022-03-05 12:45:59 70

转载 C++11使用using定义别名(替代typedef)

参考文献1、http://c.biancheng.net/view/3730.html在 C++ 中可以通过 typedef 重定义一个类型:typedef unsigned int uint_t;被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。因此,下面这样将不是合法的函数重载:void func(unsigned int);void func(uint_t); // error: redefinition使用 typedef 重定义类型是很方便的,但它也有一些限

2022-03-05 12:25:28 69

转载 C++11对模板实例化中连续右尖括号>>的改进

参考文献1、http://c.biancheng.net/view/vip_3729.html在 C++98/03 的泛型编程中,模板实例化有一个很烦琐的地方,那就是连续两个右尖括号(>>)会被编译器解释成右移操作符,而不是模板参数表的结束。【实例】C++98/03 中不支持连续两个右尖括号的示例。纯文本复制template <typename T>struct Foo{ typedef T type;};template <typename T&

2022-03-05 10:29:26 396

转载 C++返回值类型后置(跟踪返回值类型)

在泛型编程中,可能需要通过参数的运算来得到返回值的类型。考虑下面这个场景:template <typename R, typename T, typename U>R add(T t, U u){ return t+u;}int a = 1; float b = 2.0;auto c = add<decltype(a + b)>(a, b);...

2022-03-05 10:03:33 75

转载 汇总auto和decltype的区别

参考文献http://c.biancheng.net/view/vip_8670.html语法格式的区别auto 和 decltype 都是 C++11 新增的关键字,都用于自动类型推导,但是它们的语法格式是有区别的,如下所示:auto varname = value; //auto的语法格式decltype(exp) varname [= value]; //decltype的语法格式其中,varname 表示变量名,value 表示赋给变量的值,exp 表示一个表达式,方括号[ ]表示

2022-02-27 08:51:03 410

转载 C++11列表初始化(统一了初始化方式)

参考文献http://c.biancheng.net/view/3737.html我们知道,在 C++98/03 中的对象初始化方法有很多种,请看下面的代码://初始化列表int i_arr[3] = { 1, 2, 3 }; //普通数组struct A{ int x; struct B { int i; int j; } b;} a = { 1, { 2, 3 } }; //POD类型//拷贝初始化(copy-initi

2022-02-27 08:29:30 109

转载 C++11 for循环(基于范围的循环)

参考文献1、http://c.biancheng.net/view/7759.html2、http://c.biancheng.net/view/vip_7760.htmlC++11 for循环(基于范围的循环)C++ 11标准之前(C++ 98/03 标准),如果要用 for 循环语句遍历一个数组或者容器,只能套用如下结构:for(表达式 1; 表达式 2; 表达式 3){ //循环体}而 C++ 11 标准中,除了可以沿用前面介绍的用法外,还为 for 循环添加了一种全新的语法格

2022-02-27 08:29:07 157

转载 C++11 shared_ptr智能指针

转载自http://c.biancheng.net/view/7898.html在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。针对以上这些情况

2022-02-27 08:28:40 68

转载 C++11 unique_ptr智能指针

转载1、http://c.biancheng.net/view/vip_8672.html作为智能指针的一种,unique_ptr 指针自然也具备“在适当时机自动释放堆内存空间”的能力。和 shared_ptr 指针最大的不同之处在于,unique_ptr 指针指向的堆内存无法同其它 unique_ptr 共享,也就是说,每个 unique_ptr 指针都独自拥有对其所指堆内存空间的所有权。这也就意味着,每个 unique_ptr 指针指向的堆内存空间的引用计数,都只能为 1,一旦该 unique_p

2022-02-27 08:28:18 92

转载 C++11 weak_ptr智能指针

http://c.biancheng.net/view/vip_8673.htmlC++11 weak_ptr智能指针和 shared_ptr、unique_ptr 类型指针一样,weak_ptr 智能指针也是以模板类的方式实现的。weak_ptr( T 为指针所指数据的类型)定义在头文件,并位于 std 命名空间中。因此,要想使用 weak_ptr 类型指针,程序中应首先包含如下 2 条语句:#include <memory>using namespace std;第 2 句并不是

2022-02-27 08:27:51 59

转载 C++11 nullptr:初始化空指针

转载http://c.biancheng.net/view/7887.html实际开发中,避免产生“野指针”最有效的方法,就是在定义指针的同时完成初始化操作,即便该指针的指向尚未明确,也要将其初始化为空指针。所谓“野指针”,又称“悬挂指针”,指的是没有明确指向的指针。野指针往往指向的是那些不可用的内存区域,这就意味着像操作普通指针那样使用野指针(例如 &p),极可能导致程序发生异常。C++98/03 标准中,将一个指针初始化为空指针的方式有 2 种:int *p = 0;int *p =

2022-02-27 08:27:18 243

转载 C++ auto类型推导

参考文献http://c.biancheng.net/view/6984.htmlauto 类型推导的语法和规则在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的。auto 表示变量是自动存储的,这也是编译器的默认规则,所以写不写都一样,一般我们也不写,这使得 auto 关键字的存在变得非常鸡肋。C++11 赋予 auto 关键字新的含义,使用它来做自动类型推导。也就是说,使用了 auto 关键字以后,编译器会在编译期间自动推导出变量的类型,这样我们

2022-02-27 08:26:47 116

转载 C++ decltype类型推导

参考文献1、http://c.biancheng.net/view/7151.htmlauto 和 decltype 关键字都可以自动推导出变量的类型,但它们的用法是有区别的:auto varname = value;decltype(exp) varname = value;其中,varname 表示变量名,value 表示赋给变量的值,exp 表示一个表达式。auto 根据=右边的初始值 value 推导出变量的类型,而 decltype 根据 exp 表达式推导出变量的类型,跟=右边的

2022-02-27 08:26:28 93

转载 C++11 lambda匿名函数用法详解

转载自1、http://c.biancheng.net/view/7818.htmllambda 源自希腊字母表中第 11 位的 λ,在计算机科学领域,它则是被用来表示一种匿名函数。所谓匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式。lambda匿名函数的定义定义一个 lambda 匿名函数很简单,可以套用如下的语法格式:[外部变量访问方式说明符] (参数) mutable noexcept/throw() -> 返回值类型{ 函数体

2022-02-25 09:19:03 386

原创 [编程题]明明的随机数

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据(用于不同的调查),希望大家能正确处理)。注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。当没有新的输入时,说明输入结束。输入描述:注意:输

2021-10-12 22:23:26 84

原创 [编程题]汽水瓶

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?输入描述:输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空

2021-10-11 21:11:37 93

原创 SDL2源代码分析7:显示(SDL_RenderPresent())

SDL_RenderPresent()函数简介SDL使用SDL_RenderPresent()显示画面。SDL_RenderPresent()的原型如下。void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer);参数renderer用于指定渲染器。源代码分析SDL_RenderPresent()的源代码位于render\SDL_render.c中。如下所示。voidSDL_RenderPresent(SDL_Renderer * ren

2021-09-28 20:26:10 203

原创 SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())

SDL_RenderCopy()函数简介SDL使用SDL_RenderCopy()将纹理数据复制给渲染目标。SDL_RenderCopy()的原型如下。int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect *

2021-09-28 20:17:10 987

原创 SDL2源代码分析5:更新纹理(SDL_UpdateTexture())

SDL_UpdateTexture()函数简介SDL使用SDL_UpdateTexture()设置纹理的像素数据。SDL_UpdateTexture()的原型如下。int SDLCALL SDL_UpdateTexture(SDL_Texture * texture, const SDL_Rect * rect, con

2021-09-28 19:41:12 810

原创 SDL2源代码分析4:纹理(SDL_Texture)

SDL_TextureSDL_Texture结构定义了一个SDL中的纹理。/** * An efficient driver-specific representation of pixel data */struct SDL_Texture;typedef struct SDL_Texture SDL_Texture;在源代码工程中可以看到SDL_Texture的定义,位于render\SDL_sysrender.h文件中。它的定义如下。/* Define the SDL textur

2021-09-28 19:31:10 368

原创 SDL2源代码分析3:渲染器(SDL_Renderer)

SDL2源代码分析3:渲染器(SDL_Renderer)SDL_RendererSDL_Renderer结构体定义了一个SDL2中的渲染器,在SDL_render.h如下所示。/** * A structure representing rendering state */struct SDL_Renderer;typedef struct SDL_Renderer SDL_Renderer;在源代码工程中可以看到SDL_Renderer的定义,位于render\SDL_sysrender

2021-09-27 14:57:37 453

原创 SDL2源代码分析2:SDL_Window

本文分析SDL的窗口(SDL_Window)。SDL_Window的定义在…/include/SDL_video.h中/** * \brief The type used to identify a window * * \sa SDL_CreateWindow() * \sa SDL_CreateWindowFrom() * \sa SDL_DestroyWindow() * \sa SDL_FlashWindow() * \sa SDL_GetWindowData() *

2021-09-27 10:22:08 296

原创 SDL2源代码分析1:初始化(SDL_Init())

获取源代码SDL的源代码获取十分简单。访问SDL的官方网站(http://www.libsdl.org/),单击左侧的“Download”进入下载页面,然后下载“SourceCode”栏目下的文件就可以了。本文章使用SDL2-2.0.16版本下载下来的文件只有8MB左右大小,但是解压缩之后竟然有150MB左右大小。解压缩之后,源代码目录如下图所示。几个关键的文件夹如下所示:include:存储SDL的头文件的文件夹。src:存储SDL源代码文件的文件夹。SDL根据功能模块的不同,将

2021-08-13 16:21:35 696

原创 MediaInfo使用简介

MediaInfo是一款非常实用的视频参数检测工具,除了可以对视频进行编码分析查询,还可以对音频文件的编码及信息进行检测,该款工具软件是一款免费软件。基本介绍mediainfo可以获取多媒体文件的信息A.内容信息:标题,作者,专辑名,音轨号,日期,总时间……B.视频:编码器,长宽比,帧频率,比特率……C.音频:编码器,采样率,声道数,语言,比特率……D.文本:语言和字幕E.段落:段落数,列表DivX, XviD, H263, H.263, H264, x264, ASP, AVC, iTun

2021-08-11 14:53:42 804

转载 音视频流媒体————RTP流

1. 简介    实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务, RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。2. RTP码流格式    以NALU为单位打包视频流,若NALU的长度大于MTU(一次网传能够传输的最大字节数),则这个NALU需要拆分为多个RTP包。    如表1所示为RTP包的格式,RTP包由tpkt头部、rtp头部、扩展信息以及媒体流载荷组成,tpkt头部不是标准

2021-05-30 17:36:47 954

原创 CSDN字体格式修改

我是黑体字我是微软雅黑我是华文彩云strong标签加粗B标签加粗h加粗标签A headingcolor=#0099ff size=72 face=“黑体”color=#00ffffcolor=grayThis is a header

2021-05-29 22:57:51 76

转载 音视频流媒体————PS流

1. 简介每个视频帧分为若干NAL单元(NALU)。视频PS格式码流以NALU为单位进行打包。若当前为I帧或P帧的第一个NALU则需加PSH头部。若当前为I帧的第一个NALU还需要加PSM头部。每个NALU分为若干段,每段前需加PES头部,每段数据与PES头部组成PES包。音频PS格式码流以帧为单位进行打包。音频PS格式码流PSH头部可选。音频关键帧包含PSM头部。每个音频帧可分为若干段,每段前需加PES头部,每段数据与PES头部组成PES包。一般情况下音频流只包含PES包。私有数据PS格式码流以帧为

2021-05-29 22:35:22 812

原创 CSDN怎么合并单元格

<table> <tr> <td>应用层</td> <td rowspan="2">Zigbee联盟</td> </tr> <tr> <td>网络层/安全层</td> </tr> <tr> <td >MAC层 </td> <td rowspan="2">IEE802.15

2021-05-29 20:20:09 237

map工具,分析linux生產的map文件

map工具,分析linux生產的map文件

2023-04-16

rknn_sicher.c

rknn_sicher.c

2023-04-08

空空如也

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

TA关注的人

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