
c++与STL
记录c++与STL学习笔记
老朽在门外
进一寸有进一寸的欢喜
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
查看电脑的相机和麦克风名称
查看电脑的相机和麦克风,使用ffmpeg打开相机和麦克风原创 2022-10-11 10:30:25 · 532 阅读 · 0 评论 -
关闭SQLite3中的journal暂存档
相信很多使用SQLite3当做数据库的人都会一个现象,那就是当SQLite3有做写入的动作时,SQLite3会自动产生一个名为"数据库名称-journal"的暂存档。这是做什么用的呢?答案是用来Rollback ,换句话说,就是当数据写入数据库有失败动作时,透过journal档案予以复原到未更动前(原始)数据,来确保数据完整与一致性。如果在每次写入的时间很长或频繁的进行数据库写入情况下,因系统(主机)电力不稳或突然断电时,那么下次重新启动,而journal档案若存在,则在开启SQLite数据库时,若发现有原创 2022-05-23 10:43:46 · 1884 阅读 · 0 评论 -
修改注册表的值
#include<iostream>#include <string>#include <vector>#include <windows.h>#include <wincrypt.h>#include <Windows.h>#include <iostream>#include "shellapi.h"#include <locale>#include <codecvt>#inc原创 2022-01-07 15:31:38 · 1044 阅读 · 0 评论 -
客户端软件增量更新
增量更新使用到一个开源库bsdiff,bsdiff是一个差分算法,原理是旧文件跟新文件对比,尽可能多的利用old文件中已经有的内容,尽可能少的加入新的内容来构建new文件。通常的做法是对旧文件和新文件做字符串匹配或者使用hash技术提取公共部分,然后把新文件的剩余部分打成patch包(差分包中记录着新内容相对旧内容的偏移地址),在Patch阶段中用copying和insertion两个操作把旧文件和patch文件合成新文件。增量更新的流程: 在服务器端,使用bsdiff工具把旧的apk和新的apk进原创 2022-01-07 10:37:45 · 3043 阅读 · 0 评论 -
生成快捷方式
void MakeShortCut() { HRESULT hr = CoInitialize(NULL); if (SUCCEEDED(hr)) { IShellLink* pisl; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pisl); if (SUCCEEDED(hr)) { IPersistFile* pIPF;原创 2022-01-07 10:12:48 · 145 阅读 · 0 评论 -
自删除c++代码
void InitFile::DeleteApplicationSelf(){ char szCommandLine[MAX_PATH + 10]; //设置本进程为实时执行,快速退出。 SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); //通知资源管理器不显示本程序,当然如果程原创 2021-12-28 17:35:28 · 2246 阅读 · 0 评论 -
日志写法(带时间)
#include <windows.h>#include <stdio.h> /// <summary>/// 写日志文件/// </summary>/// <param name="msg"></param>/// <param name="value"></param>void CwriteLog(std::string msg) { SYSTEMTIME sys; GetLocalTi原创 2021-10-28 17:44:16 · 205 阅读 · 0 评论 -
KMP算法
#include <iostream>#include <cstring>#include <string>#include <set>#include <map>using namespace std;void BuildPatchMatchTable(int* partMatchTable, char* findstr){ if (findstr == NULL) return; partMatc原创 2021-10-25 19:37:28 · 101 阅读 · 1 评论 -
WMI技术介绍和应用
1.WMI技术介绍和应用——WMI概述https://fangliang.blog.youkuaiyun.com/article/details/8424317总结:WMI由三部分组成: WMI Consumers(WMI使用者) WMI Infrastructure(WMI基础结构)---WMI基础结构是Windows系统的系统组件。它包含两个模块:包含WMI Core(WMI核心)的WMI Service(WMI服务)(Winmgmt)和WMI Repository(WMI存储库)。 Manage原创 2021-10-25 00:36:03 · 868 阅读 · 0 评论 -
Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄
#include <windows.h>#include <stdint.h>#include <tlhelp32.h>#include <stdio.h>#include <iostream>#include <vector>typedef struct EnumHWndsArg{ std::vector<HWND>* vecHWnds; DWORD dwProcessId;}EnumHWndsArg转载 2021-09-16 17:15:36 · 3824 阅读 · 0 评论 -
Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄
#include <windows.h>#include <stdint.h>#include <tlhelp32.h>#include <stdio.h>#include <iostream>#include <vector>typedef struct EnumHWndsArg{ std::vector<HWND>* vecHWnds; DWORD dwProcessId;}EnumHWndsArg转载 2021-09-16 17:14:59 · 1580 阅读 · 0 评论 -
C++11 unique_ptr、shared_ptr 以及 weak_ptr 智能指针
1.引言在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。针对以上这些情况,很多程序员认为 C++ 语言应该提供更友好的内存管理机制,这样就可以将精原创 2021-09-08 21:45:08 · 161 阅读 · 0 评论 -
C++11 nullptr:初始化空指针
C++11 nullptr:初始化空指针1.NULL 并不是 C++ 的关键字,它是 C++ 为我们事先定义好的一个宏,并且它的值往往就是字面量 0(#define NULL 0)。C++ 中将 NULL 定义为字面常量 0,虽然能满足大部分场景的需要,但个别情况下,它会导致程序的运行和我们的预期不符。2.#include <iostream>using namespace std;void isnull(void *c){ cout << "void*c" &原创 2021-09-08 21:08:32 · 667 阅读 · 1 评论 -
C++11引用限定符的用法
C++11引用限定符的用法C++11 新添加了引用限定符。所谓引用限定符,就是在成员函数的后面添加 “&” 或者 “&&”,从而限制调用者的类型(左值还是右值)。const 和引用限定符修饰类的成员函数时,都位于函数的末尾。C++11 标准规定,当引用限定符和 const 修饰同一个类的成员函数时,const 必须位于引用限定符前面。需要注意的一点是,当 const && 修饰类的成员函数时,调用它的对象只能是右值对象;当 const & 修饰类的原创 2021-09-06 20:32:17 · 391 阅读 · 0 评论 -
C++11 constexpr和const的区别详解
C++11 constexpr和const的区别详解1.const 用于为修饰的变量添加“只读”属性;2.而 constexpr 关键字则用于指明其后是一个常量(或者常量表达式),编译器在编译程序时可以顺带将其结果计算出来,而无需等到程序运行阶段,这样的优化极大地提高了程序的执行效率。3.C++ 11标准中,为了解决 const 关键字的双重语义问题,保留了 const 表示“只读”的语义,而将“常量”的语义划分给了新添加的 constexpr 关键字。因此 C++11 标准中,建议将 con原创 2021-09-06 18:02:38 · 709 阅读 · 2 评论 -
C++ 11 标准for循环
C++ 11 标准中,除了可以沿用前面介绍的用法外,还为 for 循环添加了一种全新的语法格式,如下所示:for (declaration : expression){//循环体}其中,两个参数各自的含义如下:declaration:表示此处要定义一个变量,该变量的类型为要遍历序列中存储元素的类型。需要注意的是,C++ 11 标准中,declaration参数处定义的变量类型可以用 auto 关键字表示,该关键字可以使编译器自行推导该变量的数据类型。expression:表示要遍历的序列,常见转载 2021-09-06 16:07:32 · 735 阅读 · 0 评论 -
C++POD 类型
POD 类型一般具有以下几种特征(包括 class、union 和 struct等):没有用户自定义的构造函数、析构函数、拷贝构造函数和移动构造函数。不能包含虚函数和虚基类。非静态成员必须声明为 public。类中的第一个非静态成员的类型与其基类不同,例如:class B1{};class B2 : B1 { B1 b; };class B2 的第一个非静态成员 b 是基类类型,所以它不是 POD 类型。在类或者结构体继承时,满足以下两种情况之一:派生类中有非静态成员原创 2021-09-06 15:47:18 · 198 阅读 · 0 评论 -
将十六进制的字符串转换成十进制整数
/// <summary>/// 将十六进制的字符串转换成十进制整数/// </summary>/// <param name="s"></param>/// <returns></returns>int HexCovertDEC(const char s[]){ int i, m, temp = 0, n; m = strlen(s);//十六进制是按字符串传进来的,所以要获得字符串长度 for (i = 0;i &原创 2021-09-02 20:57:05 · 1344 阅读 · 0 评论 -
string转LPCTSTR类型
LPCTSTR不是一个类型,而是两种类型:LPCSTR和LPCWSTR其中之一。会根据你当前程序是否使用UNICODE字符集来变成那二者之一。如果使用UNICODE字符集,则LPCTSTR = LPCWSTR,如果使用Multi-Byte字符集,则LPCTSTR = LPCSTR。//Multi-Byte编码下, string转LPCSTR(LPCTSTR)类型: string str = "hello, I'm string";LPCSTR strtmp1 = str.c_str(); //原创 2021-09-02 20:09:45 · 8159 阅读 · 0 评论 -
vector中erase去除重复数据
int sFindSameName(vector<SOFTINFO> softVector, string name){ int count = 0; auto iter = softVector.begin(); //注册表 for (; iter != softVector.end(); iter++) { if (((*iter).m_strSoftName == name)) { count++; } } return count;}void sS原创 2021-09-02 15:01:52 · 314 阅读 · 0 评论 -
单词查找--c++实现
//dict.h#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>#include<math.h>#define WORDLEN 32struct word{ //存储单词 char name[WORDLEN]; //存储单词个数 int num; struct wo原创 2021-09-02 14:19:12 · 2030 阅读 · 0 评论 -
猜拳游戏c++实现
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>/*最后再优化struct{ int a[4];//存储电脑的四个随机数 int b[4];//存储用户输入的四个随机数 int count[2];//存储A和B的数量 int win_count;//统计获胜所需次数}gamer_config;*/int a[4];//存储电脑的四个随机数int b[4];//存储用户输入.原创 2021-09-02 14:02:53 · 1769 阅读 · 0 评论 -
c++11新特性--tuple
tupleC++11 标准新引入了一种类模板,命名为 tuple(中文可直译为元组)。tuple 最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。实例化 tuple 模板类对象常用的方法有两种,一种是借助该类的构造函数,另一种是借助 make_tuple() 函数。类的构造函数tuple 模板类提供有很多构造函数,包括:默认构造函数constexpr tuple();拷贝构造函数tuple (const tuple& tpl);移动构造函数tuple (tuple&转载 2021-08-29 21:11:28 · 1378 阅读 · 0 评论 -
unorder_map与map
1.C++ 常用的map类容器就是 map 和 unordered_map map的实现原理就是红黑树 每个节点到叶子节点最大树高不超过1 是平衡二叉树。查找的时间复杂度是O(lgn),但是插入和删除要维持红黑树的自平衡,所以效率较低。但是有序。 unordered_map是c++11正式加入的对hashmap的官方实现(之前标准c++没有对hashmap的官方实现,我们用的都是非官方的实现,例如平台自己的实现,hash_map中也建议以后都使用unordered_map不要使用hashmap),从名字原创 2021-08-29 20:48:32 · 1024 阅读 · 0 评论 -
C++右值引用(std::move)
https://zhuanlan.zhihu.com/p/94588204转载 2021-08-17 00:10:19 · 106 阅读 · 0 评论 -
指针与引用的区别
一、概念指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。引用:引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。引用的特性:(1)引用在定义时必须初始化;(2)一个变量可以有多个引用;(3)引用一旦绑定了一个实体,就不能再改变为其它变量的引用。二、引用和指针的区别与联系1.引用和指针有什么区别?本质:引用是别名,指针是地址,具体的:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以转载 2021-08-15 00:34:44 · 2570 阅读 · 0 评论 -
常量指针、指针常量、常量指针常量
★常量指针:指向常量的指针,在指针定义语句的类型前加const,表示指向的对象是常量。常量指针定义"const int* pointer=&a"告诉编译器,pointer是常量,不能将pointer作为左值进行操作。★指针常量定义"int* const pointer=&b"告诉编译器,pointer(地址)是常量,不能作为左值进行操作,但是允许修改间接访问值,即*pointer(地址所指向内存的值)可以修改。★常量指针常量:指向常量的指针常量,可以定义一个指向常量的指针常量,它必须在原创 2021-08-15 00:33:32 · 285 阅读 · 0 评论 -
理解C++中的左值和右值
一、前言一直以来,我都对C++中左值(lvalue)和右值(lvalue)的概念模糊不清。我认为是时候好好理解他们了,因为这些概念随着C++语言的进化变得越来越重要。二、左值和右值——一个友好的定义首先,让我们避开那些正式的定义。在C++中,一个左值是指向一个指定内存的东西。另一方面,右值就是不指向任何地方的东西。通常来说,右值是暂时和短命的,而左值则活的很久,因为他们以变量的形式(variable)存在。我们可以将左值看作为容器(container)而将右值看做容器中的事物。如果容器消失了,容器中的转载 2021-08-14 23:50:26 · 393 阅读 · 1 评论 -
C++移动构造函数(移动语义的具体实现)
转自C语言中文网–c.biancheng.net/view/7847.html当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝(而非浅拷贝)的方式复制该指针成员。#include <iostream>using namespace std;class demo{public: demo():num(new int(0)){ cout<<"construct!"<<endl; } //拷贝构造函数 demo(cons转载 2021-08-14 23:14:22 · 763 阅读 · 2 评论 -
auto与decltype
1.C++11 使用 auto 关键字来支持自动类型推导auto 类型推导的语法和规则auto 关键字基本的使用语法如下:auto name = value;name 是变量的名字,value 是变量的初始值。注意:auto 仅仅是一个占位符,在编译器期间它会被真正的类型所替代。或者说,C++ 中的变量必须是有明确类型的,只是这个类型是由编译器自己推导出来的。还有一个值得注意的地方是:使用 auto 类型推导的变量必须马上初始化,这个很容易理解,因为 auto 在 C++11 中只是“占位符”,原创 2021-08-09 21:41:29 · 1156 阅读 · 0 评论 -
C++ STL迭代器适配器
1.反向迭代器(reverse_iterator)又称“逆向迭代器”,其内部重新定义了递增运算符(++)和递减运算符(–),专门用来实现对容器的逆序遍历。reverse_iterator 模板类中共提供了 3 种创建反向迭代器的方法,这里以 vector 容器的随机访问迭代器作为基础迭代器为例。调用该类的默认构造方法,即可创建了一个不指向任何对象的反向迭代器,例如:std::reverse_iterator<std::vector::iterator> my_reiter;由此,我原创 2021-08-05 21:38:49 · 196 阅读 · 0 评论 -
容器适配器
1.stack 栈适配器是一种单端开口的容器(如图 1 所示),实际上该容器模拟的就是栈存储结构,即无论是向里存数据还是从中取数据,都只能从这一个开口实现操作。2.queue 容器适配器有 2 个开口,其中一个开口专门用来输入数据,另一个专门用来输出数据这种存储结构最大的特点是,最先进入 queue 的元素,也可以最先从 queue 中出来,即用此容器适配器存储数据具有“先进先出(简称 “FIFO” )”的特点,因此 queue 又称为队列适配器。其实,STL queue 容器适配器模拟的就是队列这种原创 2021-08-03 21:10:09 · 314 阅读 · 0 评论 -
remove与stod及erase
1.C++ 标准库 std::removestd::remove 不会改变输入vector / string 的长度。其过程,相当于去除指定的字符(以string为例),剩余字符往前靠。后面的和原始字符保持一致。详见示例程序结果#include #include #include #include int main(){std::string str1 = “Text with some spaces 123”;std::remove(str1.begin(), str1.end(),原创 2021-08-03 20:37:23 · 206 阅读 · 1 评论 -
C++ STL容器适配器详解
C++ STL容器适配器详解简单的理解容器适配器,其就是将不适用的序列式容器(包括 vector、deque 和 list)变得适用。容器适配器本质上还是容器,只不过此容器模板类的实现,利用了大量其它基础容器模板类中已经写好的成员函数。当然,如果必要的话,容器适配器中也可以自创新的成员函数。需要注意的是,STL 中的容器适配器,其内部使用的基础容器并不是固定的,用户可以在满足特定条件的多个基础容器中自由选择。1.stack基础容器需包含以下成员函数:empty()size()back()p原创 2021-08-03 19:49:10 · 256 阅读 · 0 评论 -
C++ STL无序容器(哈希容器)
C++ STL无序容器(哈希容器)是什么?无序容器是 C++ 11 标准才正式引入到 STL 标准库中的,这意味着如果要使用该类容器,则必须选择支持 C++ 11 标准的编译器。关联式容器一样,无序容器也使用键值对(pair 类型)的方式存储数据。不过,本教程将二者分开进行讲解,因为它们有本质上的不同:关联式容器的底层实现采用的树存储结构,更确切的说是红黑树结构;无序容器的底层实现采用的是哈希表的存储结构。基于底层实现采用了不同的数据结构,因此和关联式容器相比,无序容器具有以下 2 个特点:无序原创 2021-08-02 23:51:32 · 624 阅读 · 0 评论 -
如何选出最适合的C++ STL容器
如何选出最适合的C++ STL容器总的来说,C++ STL 标准库(以 C++ 11 为准)提供了以下几种容器供我们选择:序列式容器:array、vector、deque、list 和 forward_list;关联式容器:map、multimap、set 和 multiset;无序关联式容器:unordered_map、unordered_multimap、unordered_set 和 unordered_multiset;容器适配器:stack、queue 和 priority_queue。原创 2021-08-02 23:50:01 · 512 阅读 · 0 评论 -
C++ STL关联式容器种类
C++ STL 标准库提供了 4 种关联式容器,分别为 map、set、multimap、multiset1.map定义在 头文件中,使用该容器存储的数据,其各个元素的键必须是唯一的(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less)。使用 map 容器存储的各个键值对,键的值既不能重复也不能被修改。只有当 map 容器中确实存有包含该指定键的键值对,借助重载的 [ ] 运算符才能成功获取该键对应的值;反之,若当前 map 容器中没有包含该指定键的键值对,则此时原创 2021-08-02 00:23:09 · 194 阅读 · 0 评论 -
stl容器使用场景
1 总结相关容器的使用场景1)vector的使用场景:只查看,而不频繁插入删除的,因为频繁插入删除会造成内存的不断搬家和删除。使用场景比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录。2)deque的使用场景:比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加。如果采用vector,则头端移除时,会移动大量的数据,速度慢。vector与deque的比较:一:vector.at()比deque.at()效率高,比转载 2021-08-01 14:34:29 · 395 阅读 · 0 评论 -
c++移动构造函数与深拷贝、浅拷贝
C++11移动构造函数详解http://c.biancheng.net/view/7847.htmlC++深拷贝和浅拷贝(深复制和浅复制)完全攻略http://c.biancheng.net/view/2336.html原创 2021-07-30 00:23:43 · 849 阅读 · 0 评论 -
c++11新特性(STL序列式容器)
c++11新特性(STL序列式容器)1.array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全(原因后续会讲),且效率并没有因此变差。2.vectoremplace() 是 C++ 11 标准新增加的成员函数,用于在 vector 容器指定位置之前插入一个新的元素通过 insert() 函数向 vector 容器中插入 testDemo 类对象,需要调用类的构造函数和移动构造函数(或拷贝构原创 2021-07-29 00:23:58 · 547 阅读 · 0 评论