C++
y_m_h
这个作者很懒,什么都没留下…
展开
-
C++调试string类型变量显示<incomplete type>
使用*(char*[100])str_name、*(char**)&str_name可以显示其中的内容。笔者在调试C++程序时,发现string类型变量可能会显示为<incomplete type>原创 2023-03-31 10:51:24 · 395 阅读 · 1 评论 -
C++函数调用(传入形参个数比实参个数少)
C++函数调用,可以为函数参数设置默认值,这样一来,便允许在实际的函数的调用中传入形参个数比实参个数少例子:pass.hint add(int a, int b = 1);pass.cpp#include "testPass.h"int add(int a, int b) { return a + b;}main.cpp#include <iostream>#include "testPass.h"int main() { int a = 2原创 2022-04-10 22:36:56 · 1739 阅读 · 0 评论 -
C++中的内联函数
1.将函数内联的场景函数执行时间短,且被频繁调用,则将函数内联可以节省非内联调用的大部分时间2.内联函数与常规函数的区别常规函数调用使程序跳到另一个地址,并在函数结束时返回。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处,来回跳跃并记录跳转位置需要一定的开销,C++内联函数提供了另一种选择,内联函数的编译代码与其他程序代码内联,也就是编译器将使用相应的函数代码替换函数调用,内联函数被原创 2022-01-13 23:25:36 · 270 阅读 · 0 评论 -
C++中的函数返回值做为左值
1.问题笔者在阅读C++代码时,看到类似如下图所示的代码#include <iostream>using namespace std;class Person {private: string name_; int age_;public: string& Name(); int& Age(); string Name() const; int Age() const; Person(string name, int age) {原创 2022-01-13 22:01:37 · 1094 阅读 · 0 评论 -
C++中的explicit关键字
如果一个Student类提供了一个构造函数“Student::Student(string name)”,这个构造函数可用作自动的类型转换函数,例如“Student aStudent = liming”,C++可直接通过上述构造函数将一个string类型的变量转化为Student对象,这可能导致意外的类型转换,所以C++提供了explicit关键字,用于关闭这种自动特性在上述构造函数前添加explicit关键字explicit Student(string name);Student aStud原创 2021-12-29 23:09:56 · 274 阅读 · 0 评论 -
C++中的运算符重载
1.概念运算符重载是一种使对象操作更加美观的技术,可以将运算符重载理解为语法糖。运算符重载将函数重载的概念扩展到运算符上,赋予C++运算符更多含义。例如,将*用于地址,可获取这个地址中的值,将*用于两个数字,可获取两个数字的乘积C++可将运算符重载扩展到用户定义的类型,例如,允许使用+将两个对象相加,编译器根据操作数的数目和类型决定使用哪种加法定义,运算符重载使代码更加自然、容易理解要重载运算符,需使用被称为运算符函数的特殊函数形式,格式:operatorop(argument-list)2原创 2021-12-29 16:30:01 · 664 阅读 · 0 评论 -
自定义unordered_map、unordered_set的hash function、compare function
1.问题C++ STL容器类unordered_map、unordered_set使用起来非常方便,但当向容器中添加自定义类型的元素时,需提供自定义的hash function、compare function,原因:C++ STL只提供了基本类型(如int、string等)的hash function、compare function,其中,自定义hash function用于计算自定义类型对象的hash value,但由于hash function存在碰撞现象,所以自定义compare functi原创 2021-12-26 23:40:05 · 743 阅读 · 0 评论 -
Linux C++获取进程占用内存、机器内存
在Linux C++程序中获取进程占用内存、机器内存的方法:#include <unistd.h>#include <cstring>#include <iostream>using namespace std;int get_memory_by_pid(pid_t pid) { FILE* fd; char line[1024] = {0}; char virtual_filename[32] = {0}; char vmrss_nam原创 2021-12-06 21:26:56 · 5252 阅读 · 1 评论 -
构建一个遍历继承自同一父类的派生子类的迭代器
笔者在阅读Klayout源码时,发现了一段构建一个遍历继承自同一父类的派生子类的迭代器的优秀代码,特写此博客,记录自己所得Klayout是版图设计工具,版图文件格式有很多种,例如gds、oasis等,自然需要构建多种版图文件格式的reader,在Klayout读取版图文件之前,尚无法判断待读取的版图文件属于哪种文件格式,在读取了版图文件的前几个字节后,即可知道其对应的文件格式,创建对应的文件格式的reader问题:如何写这一段的业务代码呢?很容易想到的一种做法是:在读取了版图文件的前几个字节后,原创 2021-08-22 00:45:01 · 330 阅读 · 0 评论 -
LeetCode457.环形数组是否存在循环
存在一个不含0的环形数组nums,每个 nums[i] 都表示位于下标 i 的角色应该向前或向后移动的下标个数:1)如果 nums[i] 是正数,向前移动 nums[i] 步2)如果 nums[i] 是负数,向后移动 nums[i] 步因为数组是环形的,所以可以假设从最后一个元素向前移动一步会到达第一个元素,而第一个元素向后移动一步会到达最后一个元素。数组中的循环由长度为k的下标序列seq:1)遵循上述移动规则将导致重复下标序列 seq[0] ->seq[1] -> ....原创 2021-08-08 19:08:38 · 245 阅读 · 0 评论 -
LeetCode141.环形链表
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不做为参数进行传递,仅仅是为了表示链表的实际情况,pos为-1或者链表中的一个有效索引如果链表中存在环,则返回true,并返回环入口在链表中的位置。否则,返回false。示例1:输入:head=[3,2,0,-4], pos=1输出:true,原创 2021-08-08 11:27:21 · 113 阅读 · 0 评论 -
螺旋矩阵问题
题目:给定一个正整数n,生成一个包含1到 n^2 的所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。例子:输入:3 输出:[[1, 2, 3], [ 8, 9, 4], [ 7, 6, 5]]解题思路:这里使用二维数组,按照螺旋排列顺序插入正整数,排列方向共有4个,分别是从左上到右上、从右上到右下、从右下到左下、从左下到左上,这里需要注意方向变化时,数组下标的处理方式代码如下所示:#include <iostream>#include <str...原创 2021-08-07 13:23:52 · 205 阅读 · 0 评论 -
获取长度最小的子数组
给定一个整数数组和一个整数key,如果子数组元素之和不小于key,返回该类子数组中长度最小子数组对应的此题有两类解法:1)暴力解法(使用两重for循环),代码如下所示#include <iostream>#include <string>#include <vector>using namespace std;int getMinLength(vector<int>& arr, int key) { int minLen原创 2021-08-04 23:29:25 · 173 阅读 · 0 评论 -
移除一个数组中所有值等于val的元素
题目:给定一个整数数组,从数组中移除所有值等于val的元素,返回移除元素后数组的长度第一种解法(暴力解法):思路:遍历数组中的每个位置的元素,检查是否等于val,1)若等于val,则将当前位置以后的元素均前移一个位置,并继续从当前位置遍历2)若不等于val,则遍历下一个位置#include <iostream>#include <string>#include <vector>using namespace std;int deleteNu原创 2021-08-01 17:19:28 · 341 阅读 · 0 评论 -
使用C++刷题时,对输入文本行的处理方式
笔者在使用C++刷题的初期,经常无法将用户输入存储到程序中的变量,根本原因是当时没有理解C++控制台输入的原理,为此特撰写本博客记录C++控制台输入的原理及经常用到的输入函数。在控制台中输入一行字符后,按下回车键,这行字符被送入缓冲区,回车键'\r'被替换为换行键'\n',cin>>temp :先声明一个具体类型的变量,然后从缓冲区中取出按'\0'、'\t'、'\n'分割的一个字符串,并将该字符串转换为对应的类型,如果该字符串对应的类型与实现声明的类型不匹配,则会导致未定义的行为(例如,原创 2021-08-01 13:30:28 · 210 阅读 · 0 评论 -
C++处理输入文本行(一行中包含多个字符串)
第一种方法:使用cin.get(ch),循环检查输入缓冲区中的每个字符是否为空格、换行符,并进行分支处理,代码如下所示:#include <iostream>#include <string>#include <vector>using namespace std;int main() { vector<string> arr; string temp; char ch; while(cin.get(c原创 2021-08-01 00:38:15 · 1854 阅读 · 0 评论 -
给定一个有序数组和插入值,使用二分法求出插入位置
当然对一个有序数组来说,插入一个数,求出插入位置可以使用暴力算法,将插入值与有序数组从头到尾进行比较。这里介绍一种更优的二分法解法,代码如下所示#include <iostream>#include <string>#include <vector>using namespace std;int binarySearch(vector<int>& arr, int num, int left, int right) { if(l原创 2021-07-29 23:30:18 · 829 阅读 · 0 评论 -
使用多线程向同一个STL容器尾部并行插入新元素
使用多线程向同一个STL容器尾部并行插入新元素,在不进行同步管理的情况下,会出现未定义的行为。这里使用std::lock_guard进行同步管理举例:#include "boost/asio/thread_pool.hpp"#include "boost/thread.hpp"#include "boost/asio.hpp"#include <thread>#include <list>#include <iostream>#include <原创 2021-07-27 09:47:39 · 184 阅读 · 0 评论 -
gdb调试的技巧
1.调试过程中,可以修改变量的值,改变程序的执行路径2.在调试过程,为了弄清楚某段程序的具体含义,初级做法是在程序加入输出信息,这种做法比较麻烦,需要经常修改源程序,重新构建,可以使用gdb对某段程序进行单步调试,以弄清楚程序的执行逻辑,在使用gdb的过程中,经常遇到当满足某种特殊条件下去查看程序的执行逻辑,初级做法是在程序中加入如下代码段if(condition){ cout << "prompt information" << endl; // the pos原创 2021-07-13 21:48:12 · 784 阅读 · 0 评论 -
C、C++程序相互调用的四种情况
1)C++程序调用C程序a.h#ifndef A_H#define A_Hvoid f(int i);int g(int n);#endif // A_Ha.c#include <stdio.h>void f(int i) { printf("int: %d\n", i);}int g(int n) { n = n + 1; return n;}b.h#ifndef B_H#define B_Hvoid displayB(int,原创 2021-07-11 23:41:02 · 1432 阅读 · 2 评论 -
使用VSCode可以调试QT项目
在QT中将项目编译好之后,使用VSCode打开项目,也可以进行调试遇到的问题:开始使用VSCode调试QT项目时,直接将别人的项目目录拷贝到自己的文件夹中,使用VSCode打断点后,程序可以正常运行,却始终无法进入断点问题的原因:无论使用哪种集成开发环境,在将项目编译为可以调试的版本后,均使用gdb可以调试,但是调试时必须先设置断点,如果自己文件夹中的项目编译好的可执行文件是先前别人编译的,那么可执行文件加入的调试信息也是对应的原来别人编译整个项目时的路径,使用VSCode打开复制后的文件夹原创 2021-07-08 09:07:31 · 2720 阅读 · 0 评论 -
使用gcc编译,源文件无放置顺序要求
实验代码如下:a.h#ifndef A_H#define A_Hvoid displayA();#endifa.cpp#include <stdio.h>#include "a.h"void displayA() { printf("A\n");}b.h#ifndef B_H#define B_Hvoid displayB();#endifb.cpp#include <stdio.h>#include "b.h"v原创 2021-07-06 22:31:21 · 178 阅读 · 0 评论 -
使用C++ forward_list容器
如果在一种场景下,list容器、forward_list容器均能使用,则推荐使用forward_list,原因是forward_list的操作比list的操作快,而且占用的内存更少。forward_list提供了emplace_front(),可以方便地在forward_list列表头部插入元素。以下介绍如何循环在forward_list尾部插入元素。#include <iostream>#include <forward_list>using namespace原创 2021-07-06 12:05:37 · 399 阅读 · 0 评论 -
g++ 4.8默认不支持C++ 11
问题:在编写C++程序,使用到C++ 11引入的右值引用新特性时,在编译时报错解决办法:(1)在执行g++命令时,添加选项“-std=c++11”(2)在Makefile中增加选项“CXXFLAGS=-std=c++11”原创 2021-07-04 00:15:45 · 494 阅读 · 0 评论 -
C++中三种产生随机数的方法
第一种方法:使用时间做为生成随机数的种子#include <iostream>#include "stdint.h"using namespace std;// randomly generate 0 or 1int main(){ srand((unsigned)time(0)); for(int i = 0; i < 10; i++) { cout << rand() % 2 << ""; } cout <&原创 2021-06-30 16:59:10 · 6028 阅读 · 0 评论 -
使用QT打开项目,遇到警告的处理方法
问题:使用QT打开项目,遇到许多警告,但是代码没有语法问题解决方案:尝试在QT的“帮助”→“关于插件”→“C++ ClangCodeModel 不勾选”原创 2021-06-29 19:25:17 · 746 阅读 · 0 评论 -
qt构建项目时显示错误的方式
问题:在使用qt构建项目时,出现一个问题:打印的提示信息太多(包含了太多的info),需要找到error的时间很长解决方案:点击“显示警告”,这个选项可以只显示警告、error原创 2021-06-27 18:18:54 · 529 阅读 · 0 评论 -
C++调试时出现“optimized out”的原因、解决办法
C++项目经编译、链接生成可执行文件集成开发环境可生成两种类型的可执行文件,分别为Release版本、Debug版本Release版本hui't原创 2021-06-02 11:20:28 · 19054 阅读 · 3 评论 -
创建链表的一种方式
近期在阅读berkeley-abc源码时,学习了一种新的创建链表的方式,特此记录源代码:char *Aig_MmFixedEntryFetch(Aig_MmFixed_t *p){ char *pTemp; int i; // check if there are still free entries if (p->nEntriesUsed == p->nEntriesAlloc) { // need to allocate more entries as原创 2021-05-14 23:47:39 · 183 阅读 · 0 评论