C++ 11 / 14 / 17
C++开发实战,记录与分享C++的学习体会
hellokandy
我总在牛A与牛C之间徘徊!
展开
-
C++ 获取上一级文件夹路径
我们可能会经常遇到文件所在文件夹路径的问题,虽然各大平台也有提供方便快捷的API来实现,但是如果脱离平台本身,或者想实现跨平台的话,可以考虑用纯C++的代码来实现这一需求原创 2024-03-07 18:52:15 · 782 阅读 · 0 评论 -
C++ 大数相加
首先,我们需要搞懂什么是“大数”。一般而言,大数往往说的是数据长度可能很大,int、long、long long无法存放。比如说:在16位的机器中,unsigned int的最大长度为 2^16 - 1(也就是65536-1=65535)。但是现实中,非常可能会遇到比这个数字更大的数字运算,所以也就是为什么会有标题所说的“大数相加”了。原创 2023-11-17 17:26:26 · 701 阅读 · 0 评论 -
C++ 什么是BCC校验
BCC(Block Check Character),俗称异或校验。BCC的实现方法:将所有数据都和一个指定的初始值(通常是0)异或一次,所得结果为校验值。BCC一般只是用来排错的,并不是加密算法。原创 2023-03-25 21:07:10 · 1114 阅读 · 0 评论 -
C++ 如何让代码在main()函数之前或者之后执行
程序最早执行的函数其实并不是main,在main函数之前会有一系列初始化的操作(通常是由链接器等完成的)。比如在windows中,这个函数是mainCRTStartup,这个函数是链接器执行以初始化运行时库的,此函数又会调用CRTInit函数,该函数会对C全局变量、C内存分配以及C++中的全局类对象和构造函数进行初始化工作。原创 2023-03-15 15:56:23 · 1222 阅读 · 0 评论 -
C++20 std::swap_ranges 用法小结
swap_ranges() 用来交换两个序列。这个算法需要 3 个正向迭代器作为参数:前两个参数分别是第一个序列的开始和结束迭代器,第三个参数是第二个序列的开始迭代器。原创 2022-09-09 10:38:41 · 444 阅读 · 0 评论 -
C++17 std::filesystem 高阶用法
//遍历当前目录下所有文件与文件夹//遍历当前目录中所有文件(只限文件)//递归遍历目录下所有的文件//删除当前目录下所有的文件(不含文件夹)//递归删除目录下所有的文件原创 2022-09-07 12:32:31 · 2972 阅读 · 3 评论 -
C++17 std::filesystem 用法指北
写在最前:std::filesystem 需要C++17或以上的支持,如果你也是使用visual studio开发,那么可以通过 项目属性 > 配置属性 > C/C++ > 语言 > C++语言标准 进行设置。原创 2022-08-30 17:00:31 · 8079 阅读 · 1 评论 -
C++11 std::hash 用法小结
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的关系。Hash算法还具有一个特点,就是很难找到逆向规律。...原创 2022-08-30 11:19:26 · 14388 阅读 · 0 评论 -
C++11 std::mem_fn 用法小结
std::mem_fn,这里的mem不是memory的缩写,而是member的缩写,指的是类的成员member,而fn就是指function,其完整的单词应该是 member function,即mem_fn是用来适配类的成员函数的。原创 2022-08-29 17:50:27 · 1451 阅读 · 0 评论 -
STL系列之queue
queue单向队列,与栈有点类似。一个是在同一端存取数据,另一个是在一端存入数据,另一端取出数据。单向队列中的数据是先进先出(First In First Out,FIFO)。在STL中,单向队列也是以别的容器作为底部结构,再将接口改变,使之符合单向队列的特性就可以了。因此实现也是非常方便的。单向队列一共6个常用函数(front()、b原创 2016-06-02 13:20:54 · 628 阅读 · 0 评论 -
STL 之 priority_queue 的介绍与简单示例
priority_queue 优先队列,其底层是用堆来实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。在优先队列中,没有 front() 函数与 back() 函数,而只能通过 top() 函数来访问队首元素(也可称为堆顶元素),也就是优先级最高的元素。基本操作有:empty() 如果队列为空返回真pop() 删除对顶元素push() 加入一个元素size() 返...原创 2018-08-06 18:19:58 · 3136 阅读 · 0 评论 -
STL 之 vector 查找性能优化
如果一个数组元素不多,就没必要做优化了。这里要说的是一个大的数组,在进行遍历查找元素的时候,优化和没有优化的效果还是可以用肉眼看得出来的,下面是一个简单的例子:// vertor_test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <vector>#includ...原创 2018-08-08 10:54:23 · 2465 阅读 · 2 评论 -
剔除list中相同的结构体数据
剔除list中相同的结构体数据,有三个思路:1、两层循环,逐个比较2、使用set容器来剔除3、使用unique方法去重// deduplication.cpp : 定义控制台应用程序的入口点。//#include <list>#include <set>#include <iostream>#include <algorithm...原创 2016-05-06 19:05:09 · 1328 阅读 · 0 评论 -
STL 删除vector中的重复数据(unique)
#include <iostream>#include <vector>#include <algorithm>#include <assert.h>using namespace std;template<typename T>inline void deduplication(T& c) { sort(c...原创 2016-05-04 19:47:47 · 15543 阅读 · 0 评论 -
STL random_shuffle 洗牌函数了解一下
洗牌函数的含义就是将数据打乱顺序,测试代码如下:#include <iostream>#include <algorithm>#include <vector>#include <string>#include <random> // std::default_random_engine#include <time....原创 2018-08-24 17:23:42 · 4250 阅读 · 1 评论 -
STLport5.2.1 编译指南
首先下载STLport5.2.1库,STLport下载地址:https://sourceforge.net/projects/stlport/下载解压后,我放置在 D:\libs\STLport-5.2.1开始编译:第一步:打开Visual Studio 2008命令提示,输入命令行:cd D:\libs\STLport-5.2.1,如下图所示:第二步, 输入命原创 2016-08-03 11:45:23 · 2354 阅读 · 0 评论 -
C++ 如何快速清空vector以及释放vector内存?
1、为什么需要主动释放vector内存vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配...原创 2017-11-10 15:19:41 · 74777 阅读 · 1 评论 -
boost 编译指南
本文即将介绍的是,使用 VS 编译 boost 库。前提条件:在Windows中编译boost,直接使用 Visual Studio 编译器是最简单的,所以请先安装 Visual Studio,本文中使用的编译器为 Visual Studio 2008。1、下载并解压 boost Boost 的下载地址为:https://sourceforge.net/projects/原创 2016-04-14 10:33:00 · 1293 阅读 · 0 评论 -
STL 使用ofstream + ifstream 读写csv文件
csv文件,每行的数据是用逗号分隔的,读写csv文件的示例代码如下:#include "stdafx.h"#include <iostream>#include <string>#include <vector>#include <fstream>#include <sstream>using std::ifstrea...原创 2018-08-09 11:45:29 · 4077 阅读 · 1 评论 -
C++ map按照key或者value排序小结
在STL中,map 默认是按照 key 的 less 方法进行排序的。如果希望改变map的KEY排序规则,可以用到以下两种方法:#include <iostream>#include <string>#include <map>using namespace std;typedef pair<string, double> PA...原创 2019-03-18 10:32:54 · 4008 阅读 · 0 评论 -
STL系列之stack
栈(stack),这种数据结构在计算机中是相当出名的。栈中的数据是先进后出的(First In Last Out, FILO)。栈只有一个出口,允许新增元素(只能在栈顶上增加)、移出元素(只能移出栈顶元素)、取得栈顶元素等操作。在STL中,栈是以别的容器(标准的容器类模板vector, deque 和list可以使用。默认情况下,如果没有容器类被指定成为一个提别的stack 类,标准的容器原创 2016-05-31 10:30:54 · 382 阅读 · 0 评论 -
STL 使用 erase 删除元素时 iterator 失效
STL中的容器按存储方式分为两类:一类是序列容器(如:vector,deque),另一类是关联容器(如:list,map,set)。在使用erase方法删除元素时,有几点需要注意:1) 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为原创 2016-08-26 13:58:03 · 3254 阅读 · 1 评论 -
boost 时间与日期处理
类特点缺点说明timer计时基类不适合大跨度时间适用大部分的普通计时progress_timer继承自timer 可以自动写入流中只精确到0.01s如果需要更精确,可派生个类,调用stream的precision设置progress_display图形化显示进度只转载 2016-01-27 11:29:42 · 3012 阅读 · 0 评论 -
C++11 tuple的用法浅析
tuple 元组定义了一个有固定数目元素的容器,其中的每个元素类型都可以不相同,这与其他容器有着本质的区别,是对pair的泛化,常用于函数的多返回值。以下代码是关于tuple使用的一些示例,一部分来源于网上,经过整理后发出来#include "stdafx.h"#include <iostream>#include <tuple>#include <f...原创 2020-02-22 16:00:38 · 2978 阅读 · 0 评论 -
C++11 使用智能指针改进单例模式
本文主要关于如何使用C++11的智能指针改进单例模式。智能指针在C++11版本之后提供,包含在头文件中,shared_ptr、unique_ptr、weak_ptr。设计初衷:线程安全、垃圾回收、单例对象可接受多个参数。1、使用shared_ptr相对于一般的单例实现而言,使用了可变参数模板使得单例对象可接受多个参数:#pragma once#include <mutex>#include <memory>template<typename T>class原创 2021-01-14 16:17:57 · 6003 阅读 · 3 评论 -
C++11 std::string与std::wstring的相互转换
C++11中,关于std::string与std::wstring的相关转换#include <string>#include <locale>#include <codecvt>// convert string to wstringinline std::wstring to_wstring(const std::string& input){ std::wstring_convert<std::codecvt_utf8<wchar原创 2022-01-22 15:53:53 · 2180 阅读 · 0 评论 -
C++11 std::all_of、std::any_of、std::none_of 的用法小结
如果需要判断容器中,全部元素或者任意元素满足或者不满足某个条件,那么你就有必要了解一下stdall_of、stdany_of、stdnone_of。原创 2022-07-25 10:55:37 · 3659 阅读 · 0 评论 -
C++11 std::array 用法小结
std::array 是在 C++11 中引入的,与内置数组相比,std::array是一种更安全、更容易使用的数组类型。与内置数组类似,std::array对象的大小是固定的。因此,std::array不支持添加和删除元素以及改变容器大小的操作。std::array 除了有传统数组支持随机访问、效率高、存储大小固定等特点外,还支持迭代器访问、获取容量、获得原始指针等高级功能。而且它还不会退化成指针T *给开发人员造成困惑。.........原创 2022-07-19 20:58:11 · 4099 阅读 · 0 评论 -
C++11 遍历目录下的文件
目录下文件的遍历(C++代码实现)#include <iostream>#include <filesystem>using std::experimental::filesystem::v1::directory_iterator;using std::experimental::filesystem::v1::path;int main(){ int count = 0; for (auto &v : directory_iterator("."))原创 2021-05-18 14:24:18 · 5895 阅读 · 5 评论 -
C++11 std::for_each 用法小结
std::for_each相较于for而言,它可以帮助在STL容器中的每个元素都执行一次fn()函数。原创 2022-07-25 12:28:17 · 2063 阅读 · 0 评论 -
C++11 std::copy、std::copy_if 用法小结
在C++编程中,经常会涉及两个容器之间的数据拷贝(如数组之间元素的拷贝),常规的做法一般都是用for循环逐个元素进行拷贝。在数据量不大的情况下还可以,如果数据量比较大,效率则会比较低下。而stdcopy就是一个专门用于容器间拷贝的函数,其效率是优于使用for循环的!.........原创 2022-07-26 17:51:50 · 6677 阅读 · 1 评论 -
C++ 关于“Expression: __acrt_first_block == header”的一点总结
先说结论:在MSVC/MT编译时,动态库的接口返回值尽量不要std::string原因分析:导致异常的根本原因是:对象在析构时不能正确释放内存std::string是STL中定义的模板类,所以编译器在编译动态库时会将std::string实例化,在编译exe时也会将其实例化,也就是说有两套std::string实例代码分别在exe和dll中。由于是MT编译的,在exe中并不能区分这个std::string对象的内存是不是自己的的heap中分配的,所以析构result,会调用exe中实例化的std:原创 2020-10-27 16:50:58 · 4346 阅读 · 2 评论 -
C++ 使用std::min或std::max 报错!
在Windows项目中,如果使用std::min或std::max,有可能在编译的时候提示以下内容:error C2589 : “(” : “::”右边的非法标记error C2144 : 语法错误:“unknown - type”的前面应有“)”error C2144 : 语法错误:“unknown - type”的前面应有“; ”error C2062 : 意外的类型“int”error C2059 : 语法错误:“)”error C2059 : 语法错误:“)”其原因在于vc和c++模转载 2020-09-27 19:59:46 · 11352 阅读 · 1 评论 -
C++ 关于多态的一些总结
本文将围绕下面四个问题,进行逐一阐述:1、什么是多态;2、多态有什么用;3、多态的原理是什么;4、如何实现多态;5、C++的纯虚函数一、什么是多态?(1)通过继承同一个基类,产生了相关的不同的派生类,与基类中同名的成员函数在不同的派生类中会有不同的实现,也就是说:一个接口、多种方法。(2)多态是面向对象的重要技术之一,它是一种行为的封装,是同一个事物所表现出来的多种形态。简单......原创 2018-09-18 18:30:49 · 521 阅读 · 0 评论 -
strcpy 和 memcpy 有什么区别
strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。me...原创 2020-01-14 19:12:53 · 989 阅读 · 0 评论 -
C++ 手工编写智能指针
其实,我也不知道原作者是谁了,今天把代码整理后,测试没问题就发上来了:// smartptr_test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <windows.h>using namespace std;#define SAFE_DELETE(p) if...原创 2019-10-30 11:21:36 · 277 阅读 · 1 评论 -
C++ string 的 assign 赋值常用方法
函数assign()常用在给string类变量赋值,其常用方法有:1,直接用另一个字符串赋值如str2.assign(str1);即用str1给str2赋值2,用另一个字符串的一个子串赋值如str3.assign(str1, 2, 3);3,用一个字符串的前一段子串赋值如str4.assign("World", 5);4,用几个相同的字符赋值如str5.assign...原创 2016-03-29 21:40:44 · 1813 阅读 · 0 评论 -
C语言atexit()函数
C语言atexit()函数:设置程序正常结束前调用的函数相关函数:_exit, exit, on_exit头文件:#include 定义函数:int atexit (void (*function) (void));函数说明:atexit()用来设置一个程序正常结束前调用的函数. 当程序通过调用exit()或从main 中返回时, 参数function 所指定的函数会先被调用, 然转载 2016-04-01 20:56:09 · 1281 阅读 · 0 评论 -
imbue(std::locale("chs"))
最近遇到从文本文件里面读取中文,出现乱码的问题。于是上网找了些资料,并对网上代码进行了修改。首先,介绍下imbue函数:imbue函数是指对象引用,表示输出时,使用的区域语言对象。函数原型:locale basic_ios::imbue(const locale&loc);参数说明:loc: const 对象引用,表示输出时,使用的区域语言对象返回值:之前的使用原创 2016-04-06 15:19:01 · 5524 阅读 · 0 评论 -
预编译头文件(stdafx.h)的原理
stdafx名称的英文全称为:Standard Application Framework Extensions 所谓头文件je预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。 预编译头文件通过编译stdafx....转载 2016-01-06 15:38:25 · 1325 阅读 · 0 评论