C++
文章平均质量分 52
另寻沧海
这个作者很懒,什么都没留下…
展开
-
std::copy, std::copy_if
std::copy, std::copy_if。原创 2022-10-30 20:46:08 · 228 阅读 · 0 评论 -
快速或安全的访问std::vector实例的方法, std::vector的插入排序
可能是STL容器中适用范围最广的,因为其存储数据的方式和数组一样,并且还有相对完善的配套设施。不过,非法访问一个vector实例还是十分危险的。如果一个vector实例具有100个元素,那当我们想要访问索引为123的元素时,程序就会崩溃掉。如果不崩溃,那么你就麻烦了,未定义的行为会导致一系列奇奇怪怪的错误,查都不好查。经验丰富的开发者会在访问前,对索引进行检查。这样的检查其实比较多余,因为很多人不知道有内置的检查机制。原创 2022-10-30 20:26:57 · 904 阅读 · 0 评论 -
以O(1)的时间复杂度删除未排序std::vector中的元素
# 以O(1)的时间复杂度删除未排序std::vector中的元素原创 2022-10-30 19:46:53 · 982 阅读 · 0 评论 -
高效擦除/移除(Erase–remove idiom)std::vector元素
擦除/移除std::vector元素原创 2022-10-30 19:29:50 · 3849 阅读 · 0 评论 -
std::boolalpha
1.头文件#include <iostream>2.使用说明让输出流将bool解析成为true或者 false3、示例代码#include <iostream>void test_boolalpha(){ std::cout << "true is " << true << std::endl; std::cout << "false is " << false << std::endl;原创 2022-05-16 17:26:55 · 567 阅读 · 0 评论 -
函数名作为字符串输出(Function Names as Strings)
GCC 预定义了两个标识符来保存当前函数的名称。 标识符 __FUNCTION__ 包含函数在源代码中出现的名称。 标识符 __PRETTY_FUNCTION__ 包含以特定语言方式漂亮打印的函数名称。https://www.onlinegdb.com/ online gdb 验证这些名称在 C 函数中始终相同,但在 C++ 函数中它们可能不同。 例如,这个程序:#include <stdio.h>void test_macroFunction(int i, int j){原创 2022-05-16 17:16:46 · 409 阅读 · 0 评论 -
使用C++11解决内存泄露--智能指针
C++11提供了智能指针,使用智能指针后不需要用户自己释放内存空间,一旦使用时对象超出了自己的生命周期,就会进行自动释放,从而有效解决了内存泄露的问题。在实际编程时,有三种智能指针可供使用,分别是:std::shared_ptr、std::unique_ptr和std::weak_ptr。1 共享智能指针:std::shared_ptrstd::share_ptr指针的每一个拷贝都指向同一个对象,只有在引用计数为零时内存才会被释放。指针声明原型为:template class shared_pt原创 2022-03-25 10:45:18 · 1249 阅读 · 0 评论 -
常量表达式值 constexpr
常量表达式值(constant-expression value)。通常情况下,常量表达式值必须被一个常量表达式赋值,而跟常量表达式函数一样,常量表达式值在使用前必须被初始化。一、常量表达式1.1 运行时常量性与编译时常量性在C++中,我们常常会遇到常量的概念。常量表示该值不可修改,通常是通过const关键字来修饰的。比如:const int i = 3;const还可以修饰函数参数、函数返回值、函数本身、类等。在不同的使用条件下,const有不同的意义,不过大多数情况下,const描述的都原创 2022-03-24 17:08:23 · 1771 阅读 · 0 评论 -
C++基础之元编程与constexpr
元编程(metaprogramming)是一个典型的复合词,他由前缀 meta- 和词根 programming 复合而成,有“对一个程序进行编程”的意思。换句话说,编译器先编译你的代码,得到一份新的代码,然后再编译新的代码来解决问题。模板元编程技术,即把一些可以在编译时完成的求值计算,通过模板特化的技术绑定到具体的实例化代码上,从而减少不必要的代码量,提升代码的运行效率。一、C++的元编程1.1 为什么要元编程呢?前面我们知道了什么是元编程,那么为什么要有这种编写技巧呢?无外乎两点:减少重复的代原创 2022-03-24 14:16:48 · 2671 阅读 · 1 评论 -
模板偏特化 Partial specialization
偏特化是指如果一个 class template 拥有一个以上的 template 参数,我们可以针对其中某个(或多个,但不是全部)template 参数进行特化,比如下面这个例子template <typename T>class C {...}; //此泛化版本的 T 可以是任何类型template <typename T>class C<T*> {...}; //特化版本,仅仅适用于 T 为“原生指针”的情况,是泛化版本的限制版所谓特化,就是特殊情原创 2022-03-23 18:42:20 · 801 阅读 · 0 评论 -
c++11中 std::ref() 和 引用 &
使用std::ref可以在模板传参的时候传入引用,否则无法传递&是类型说明符, std::ref 是一个函数,返回 std::reference_wrapper(类似于指针)用std::ref 是考虑到c++11中的函数式编程,如 std::bind.C++11的设计者认为bind默认应该采用拷贝,如果使用者有需求,加上std::ref()即可。同理std::thread也是这样。example:#include <functional>#include <iostre原创 2022-03-11 15:58:46 · 713 阅读 · 0 评论 -
2021-08-29
fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。ifstream -- 从已有的文件读ofstream -- 向文件写内容fstream - 打开文件供读写文件打开模式:ios::in 读ios::out 写ios::app 从文件末尾开始写ios::binary 二进制模式ios::nocreate 打开一个文件时,如果文件不存在,不创建文件。ios::noreplace 打开一个文件时,如果文件不存在,创建该文件ios::trunc 打开一个原创 2021-08-29 16:10:28 · 119 阅读 · 0 评论 -
C/C++ 中的static关键字
目录:静态成员变量(面向对象)静态成员函数(面向对象)静态全局变量(面向过程)静态局部变量(面向过程)静态函数(面向过程)1. (面向对象的)静态成员变量在类内成员变量的声明前加上关键字static,该数据成员就是类内的静态数据成员。#include <iostream>using namespace std;class Myclass{public: Myclass(int a, int b, int c); void GetSum();private: int原创 2021-08-15 14:58:01 · 276 阅读 · 0 评论 -
C++ 单例模式
https://zhuanlan.zhihu.com/p/37469260原创 2021-08-15 14:18:31 · 62 阅读 · 0 评论 -
C++ 虚函数、纯虚函数
https://zhuanlan.zhihu.com/p/37331092https://blog.csdn.net/MUMU23333/article/details/80105446原创 2021-08-15 13:44:12 · 247 阅读 · 0 评论 -
C++11 decltype表达式
decltype在某些情况下,不需要或者不能定义变量,但是希望得到某种类型,这时候就可以使用 C++11 提供的 decltype 关键字了,它的作用是在编译器编译的时候推导出一个表达式的类型,语法格式如下:C++ decltype (表达式)decltype 是 “declare type” 的缩写,意思是 “声明类型”。decltype 的推导是在编译期完成的,它只是用于表达式类型的推导,并不会计算表达式的值。来看一组简单的例子:int a = 10;decltype(a) b = 99;原创 2021-08-08 10:34:24 · 1122 阅读 · 0 评论 -
C++11 auto
在 C++11 中增加了很多新的特性,比如可以使用 auto 自动推导变量的类型,还能够结合 decltype 来表示函数的返回值。使用新的特性可以让我们写出更加简洁,更加现代的代码。auto在 C++11 之前 auto 和 static 是对应的,表示变量是自动存储的,但是非 static 的局部变量默认都是自动存储的,因此这个关键字变得非常鸡肋,在 C++11 中他们赋予了新的含义,使用这个关键字能够像别的语言一样自动推导出变量的实际类型。1.1 推导规则C++11 中 auto 并不代表一种原创 2021-08-08 09:46:59 · 703 阅读 · 0 评论 -
C++11 继承构造函数
继承构造函数C++11 中提供的继承构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派生类构造函数的编写。先来看没有继承构造函数之前的处理方式:#include <iostream>#include <string>using namespace std;class Base{public: Base(int i) :m_i(i) {} Base(int i, double j) :原创 2021-08-07 19:33:13 · 277 阅读 · 0 评论 -
C++11 委托构造函数
委托构造函数委托构造函数允许使用同一个类中的一个构造函数调用其它的构造函数,从而简化相关变量的初始化。下面举例说明:#include <iostream>using namespace std;class Test{public: Test() {}; Test(int max) { this->m_max = max > 0 ? max : 100; } Test(int max, int min) {原创 2021-08-07 19:23:34 · 229 阅读 · 0 评论 -
C++11 using 语法
using 语法和 typedef 一样,并不会创建出新的类型,它们只是给某些类型定义了新的别名。using 相较于 typedef 的优势在于定义函数指针别名时看起来更加直观,并且可以给模板定义别名。在 C++ 中 using 用于声明命名空间,使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后,就可以直接使用命名空间中的定义的类了。在 C++11 中赋予了 using 新的功能,让 C++ 变得更年轻,更灵活。1. 定义别名在 C++ 中可以通过 typedef 重定义一个类型,语法格式如原创 2021-08-07 19:08:48 · 1143 阅读 · 1 评论 -
C++11 final和override
C++ 中增加了 final 关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果使用 final 修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。修饰函数如果使用 final 修饰函数,只能修饰虚函数,这样就能阻止子类重写父类的这个函数了:#include <iostream>using namespace std;class Base{public: virtual void test() { cout <原创 2021-08-07 11:39:20 · 329 阅读 · 0 评论 -
C++ 11 & 14 中的Lambda表达式
auto func = [capture] (params) opt -> ret { func_body; };[捕获列表] (形参列表) mutable 异常列表-> 返回类型{ 函数体 }捕获列表:定义lambda函数所在的作用域中的指定变量可以在lambda函数中使用其中func是可以当作lambda表达式的名字,作为一个函数使用,capture是捕获列表,params是参数表,opt是函数选项(mutable之类), ret是返回值类型,func_body是函数体。各项的含义:原创 2021-07-28 21:04:08 · 446 阅读 · 0 评论 -
在 RHEL/CentOS 7 安装高版本GCC
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, and Go, as well as libraries for these languages (libstdc++,…). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to原创 2021-07-07 19:51:10 · 1555 阅读 · 0 评论 -
不同gcc编译内联函数的差异
inline reference:https://blog.csdn.net/zqixiao_09/article/details/50877383gcc8.3 必须声明,不然报错, undefined reference to `xxx’$ make test && ./test cc test.c -o test/tmp/ccLJDAHG.o: In function `main':test.c:(.text+0x25): undefined reference原创 2021-05-14 17:08:50 · 206 阅读 · 0 评论 -
STL- 常用算法
概述:算法主要是由头文件 组成。是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等体积很小,只包括几个在序列上面进行简单数学运算的模板函数定义了一些模板类,用以声明函数对象。算法简介:for_each功能描述:实现遍历容器函数原型:for_each(iterator beg, iterator end, _func);// 遍历算法 遍历容器元素// beg 开始迭代器// end 结束迭代器// _func 函数或者函数对象原创 2021-04-18 11:32:02 · 75 阅读 · 0 评论 -
STL 内建函数对象
内建函数对象概念:STL内建了一些函数对象分类:算术仿函数关系仿函数逻辑仿函数用法:这些仿函数所产生的对象,用法和一般函数完全相同使用内建函数对象,需要引入头文件 #include算术仿函数功能描述:实现四则运算其中negate是一元运算,其他都是二元运算仿函数原型:template T plus //加法仿函数template T minus //减法仿函数template原创 2021-04-18 10:39:39 · 103 阅读 · 0 评论 -
STL 一元谓词 二元谓词
谓词概念概念:返回bool类型的仿函数称为谓词如果operator()接受一个参数,那么叫做一元谓词如果operator()接受两个参数,那么叫做二元谓词#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;/*谓词概念概念:- 返回bool类型的仿函数称为谓词- 如果operator()接受一个参原创 2021-04-18 10:29:15 · 489 阅读 · 0 评论 -
STL- 函数对象
#include <iostream>#include <string>using namespace std;/*函数对象概念概念:- 重载函数调用操作符的类,其对象常称为函数对象- 函数对象使用重载的()时,行为类似函数调用,也叫仿函数本质:函数对象(仿函数)是一个类,不是一个函数*//* 函数对象使用特点:- 函数对象在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值- 函数对象超出普通函数的概念,函数对象可以有自己的状态- 函原创 2021-04-18 09:53:38 · 89 阅读 · 0 评论 -
vector and multimap 案例练习
员工分组案例描述公司今天招聘了10个员工(ABCDEFGHIJ),10名员工进入公司之后,需要指派员工在那个部门工作员工信息有: 姓名 工资组成;部门分为:策划、美术、研发随机给10名员工分配部门和工资通过multimap进行信息的插入 key(部门编号) value(员工)分部门显示员工信息#include <iostream>#include <string>#include <vector>#include <map>usin原创 2021-04-17 20:26:59 · 124 阅读 · 0 评论 -
map/ multimap容器
简介:map中所有元素都是pairpair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值自动排序本质:map/multimap属于关联式容器,底层结构是用二叉树实现。优点:可以根据key值快速找到value值map和multimap区别:map不允许容器中有重复key值元素multimap允许容器中有重复key值元素#include<iostream>#include<map>using nam原创 2021-04-17 18:56:05 · 95 阅读 · 0 评论 -
对组pair和元组tuple的基本使用
测试环境visual stdio 2019,C++14#include <iostream>#include <string>#include <set>#include <tuple>using namespace std;//成对出现的数据,利用对组可以返回两个数据void testPair(){ //cteate pair,first method pair<string, int>p("Tom", 20); cout原创 2021-04-17 15:11:39 · 260 阅读 · 0 评论 -
linux cpp中精确获取程序的执行时间
clock_gettime使用示例:struct timespec start;struct timespec end;clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start);long i =0;while(i<10e8){ i++;}clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&end);double start_ms =start.tv_sec*1000+start.tv_nsec/1原创 2021-04-11 21:35:14 · 465 阅读 · 0 评论 -
linux 获取程序执行时间的方法
code:#include <stdio.h>#include <stdarg.h>#include <unistd.h>/*for sleep*/#include <sys/times.h>/*for times*/#include <sys/time.h>/*for getimeofday*///#include <sys/conf.h>/*old system for sysconf*/#include <ti原创 2021-04-11 21:25:06 · 691 阅读 · 0 评论 -
Linux 编程实践-时间与时区 时间的表现形式与解析
时间的三种表现形式1. 时间戳(timestamp, seconds since the Epoch) 即可 1970 年 1 月 1 日 0 时 0 分 0 秒起的 UTC(Universal Coordinated Time)时间的经过的秒数. (UTC 之前也叫 GMT Greenwich Mean Time)2. 时间结构体 struct tm struct tm { int tm_sec; /* seconds after the minute [0-60] *.原创 2021-04-11 21:09:34 · 349 阅读 · 0 评论 -
c++11原始字面量
在 C++11 中添加了定义原始字符串的字面量,**定义方式为:R “xxx(原始字符串)xxx” 其中()两边的字符串可以省略。**原始字面量 R 可以直接表示字符串的实际含义,而不需要额外对字符串做转译或连接等操作。注意:在R “xxx(raw string)xxx” 中,原始字符串必须用括号()括起来,括号的前后可以加其他字符串,所加的字符串会被忽略,并且加的字符串必须在括号两边同时出现。#include<iostream>#include<string>using n原创 2021-04-06 20:26:07 · 327 阅读 · 0 评论 -
GCC支持C++11编译
gcc编译的四个阶段https://blog.csdn.net/weixin_42244181/article/details/107426386当使用GCC编译时,如果需要使用C++11的标准去编译。就需要在编译时指令中加入-std=c++11, gcc版本要支持C++11$ g++ -g -Wall -std=c++11 demo_auto.cpp $ lsa.out demo_auto.cpp未指定输出文件名默认为a.out$ g++ -g -Wall -std=c++11 demo原创 2021-04-06 19:54:22 · 3949 阅读 · 0 评论 -
c/c++中日期和时间的获取
timeStamp() //获取到hour,min,sec,格式为 hh:mm:ssdateStamp() //获取到year,mon,day,格式为 xxxx:xx:xx#include <string>#include <iostream>#include <time.h>// source code from corecrt_wtime.h// Types//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+原创 2021-03-21 21:33:58 · 702 阅读 · 1 评论 -
C++ const常量对象、常量成员函数和常引用
常函数:成员函数后加const后我们称为这个函数为常函数常函数内不可以修改成员属性成员属性声明时加关键字mutable后,在常函数中依然可以修改常对象:声明对象前加const称该对象为常对象常对象只能调用常函数实例:class Person {public: Person() { m_A = 0; m_B = 0; } //this指针的本质是一个指针常量,指针的指向不可修改 //如果想让指针指向的值也不可以修改,需要声明常函数 void ShowPerson(原创 2021-03-10 22:13:37 · 149 阅读 · 0 评论 -
STL学习回顾-list list 插入和删除
函数原型:- push_back(elem); //在容器尾部加入一个元素- pop_back(); //删除容器中最后一个元素- push_front(elem); //在容器开头插入一个元素- pop_front(); //从容器开头移除第一个元素- insert(pos,elem); //在pos位置插elem元素的拷贝,返回新数据的位置。- insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。- insert(pos,beg原创 2021-01-19 22:14:43 · 287 阅读 · 0 评论 -
STL学习回顾-list容器
功能:将数据进行链式存储链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一个双向循环链表list的优点:采用动态存储分配,不会造成内存浪费和溢出链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素list的缺点:链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大List有一个重要的性质,插原创 2021-01-19 22:03:04 · 91 阅读 · 0 评论