c++
zj134_
以物喜
展开
-
c++ setw(int n)函数
setw - C++ Reference头文件:#include <iomanip>函数原型:setw (int n);用于输出流中进行字段宽度设置,n表示字段宽度。具有以下几个特点:Sets the number of characters to be used as the field width for the next insertion operation.意思就是只对紧挨着的下一次输出有效右对齐:输出字段宽度小于 n 时,字段前面用空格补齐输出字段宽度大于 n原创 2020-11-05 19:51:38 · 781 阅读 · 0 评论 -
面向对象的思想设计榨汁机的类
榨汁机的特点是放入苹果得苹果汁,放入香蕉得香蕉汁,而具体制作的过程并不关心。#include <iostream>#include <string>using namespace std;typedef enum{//枚举水果 apple, banana, orange, nothing}Fruit_type;class Fruit{//抽象水果类public: virtual const string& type()原创 2020-10-13 13:04:18 · 490 阅读 · 0 评论 -
关于函数strcpy、strncpy和memcpy的细节
参考:别再耍流氓了: 请别再用strcpy, 而用strncpy_认知 行动 坚持-CSDN博客C/C++笔记–strcpy和strncpy函数的安全性分析_xpu_zhouxin的博客-CSDN博客strcpy有什么危险?函数原型:char* strcpy(char* strDest, const char* strSrc)char* strncpy(char* strDest, const char* strSrc, size_t n)strcpy: 用于拷贝字符串,会拷贝 '\0',当原创 2020-09-12 15:45:24 · 614 阅读 · 0 评论 -
malloc 底层实现及原理
原文:malloc 底层实现及原理 - 爱笑的张飞 - 博客园文章目录结论具体内容内存分配的原理具体分配过程情况一:malloc 小于 128K 的内存,使用 brk 分配情况二:malloc 大于 128K 的内存,使用 mmap 分配(munmap 释放)摘要:偶尔看到面试题会问到 malloc 的底层原理,今天就来记录一下,毕竟学习要“知其所以然”,这样才会胸有成竹。注:下面分析均是基于 linux 环境下的 malloc 实现。步骤是:先总结结论,再逐步展开结论1)当开辟的空间小于 12转载 2020-10-22 11:24:08 · 1708 阅读 · 0 评论 -
C++ 的placement new和placement delete
参考:placement new和placement delete_hujing_Liu-CSDN博客《effctive C++》p256通常的C++程序中,new和delete表达式总是成对出现,并且分别调用了全局的operator new和operator delete,这两个全局操作符(或者直接理解为全局的函数)的基本形式如下:void * operator new ( std::size_t) throw ( std::bad_alloc );void operator delete (原创 2020-10-20 16:08:56 · 1550 阅读 · 0 评论 -
C++智能指针简单实现
参考:C++ 引用计数技术及智能指针的简单实现 - melonstreet - 博客园c++ primer 5th 12.1文章目录智能指针是什么普通指针存在的问题什么是引用计数?智能指针实现基础对象类辅助类为基础对象类实现智能指针类智能指针类的使用与测试智能指针类的改进一智能指针改进二智能指针是什么简单来说,智能指针是一个管理内存的类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,拷贝对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一转载 2020-10-19 19:31:52 · 1138 阅读 · 0 评论 -
c++类型转换
参考:C++类型转换 - kaizen - 博客园C++类型转换 - 好吧,就是菜菜 - 博客园文章目录隐式类型转换内置类型自定义类型其他隐式转换显式转换static_castconst_castdynamic_castreinterpret_cast隐式类型转换指不需要用户干预,编译器默认进行的类型转换行为。隐式类型转换一般分为两种:内置数据类型和自定义数据类型。内置类型例1、不同类型的算术运算int ival = 3.541 + 3;加法的运算对象是double+int,所以首先会将原创 2020-10-19 15:52:59 · 298 阅读 · 0 评论 -
c++嵌套类和局部类
C++ 中的嵌套类和局部类_Ivan 的专栏-CSDN博客C++嵌套类的使用及对外部类的访问权限_多学多思-CSDN博客C++嵌套类(内部类与外部类) - 永不停息; - 博客园C++嵌套类及对外围类成员变量的访问 - 菜丝inside - 博客园...原创 2020-10-18 15:47:25 · 225 阅读 · 0 评论 -
从4行代码看右值引用(转)
原文:从4行代码看右值引用 - qicosmos(江南) - 博客园从4行代码看右值引用概述右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j = i;这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,对右值进行绑定的引用就是右值引用,他的语法是这样的A&&,通过双引号来表示绑定类型为A的右值。通过&&我们就转载 2020-10-15 14:18:49 · 109 阅读 · 0 评论 -
BitMap算法和C++ STL里面的bitset
原文:BitMap算法和C++ STL里面的bitset_阿飝的博客-CSDN博客今天看到大数据处理的BitMap算法,可以有效地对空间进行压缩。一、BitMap基本思想在32位的机器上,一个int需要占据32位,而有时候这就是很大的空间浪费。比如没有重复数字的计数排序的时候,假设数据范围[0,1e8],则需要开辟数组int a[(int)1e8+1],a[i]表示i的出现的次数。这就需要大约400M的空间了。然而,由于数字不会重复,所以a[i]只会是0或1,那么32位的int必然对空间造成了很大的浪转载 2020-10-12 14:42:59 · 529 阅读 · 0 评论 -
C++单例模式
原文:C++ 单例模式总结与剖析 - 行者孙 - 博客园文章目录C++ 单例模式总结与剖析一、什么是单例二、C++单例的实现2.1 基础要点2.2 C++ 实现单例的几种方式2.2.1 有缺陷的懒汉式2.2.2 线程安全、内存安全的懒汉式单例 (智能指针,锁)2.2.3 最推荐的懒汉式单例(magic static )——局部静态变量2.2.4 函数返回引用2.2.5 饿汉版(Eager Singleton)2.3 单例的模板2.3.1 CRTP 奇异递归模板模式实现三、何时应该使用或者不使用单例反对单转载 2020-10-10 14:09:18 · 434 阅读 · 0 评论 -
sizeof和strlen的区别
如果仅仅对于字符串来说,sizeof会考虑末尾的 \0,strlen则不会。而更深层次的区别是:sizeof是一个操作符,而strlen是库函数sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为’\0’的字符串作参数编译时就计算出了sizeof的结果,而strlen必须在运行时才能计算出来sizeof计算数据类型占内存的大小(所以必然会考虑\0),strlen计算字符串实际长度。...原创 2020-09-12 15:47:53 · 218 阅读 · 0 评论 -
大小端字节序以及如何判断大小端
参考:什么是大小端?如何确定大小端?_wwwlyj123321的博客-CSDN博客不同的cpu(大小端是由cpu决定的)在存储数据的时候会有不同的策略:将低序字节存在起始地址(低地址),叫小端字节序将高序字节存在起始地址(低地址),叫大端字节序如图:假如现有一32位int型数0x12345678,那么其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78,那么:上面的数字使用代码进原创 2020-10-08 21:05:58 · 852 阅读 · 0 评论 -
c++ getline不执行的坑
如图:getline应该执行两次才是,但是因为前面有一个cin,cin最后的回车被getline捕获了,认为是一次输入,所以输出里面才会有空行。解决办法就是cin之后加一个cin.ignore()原创 2020-09-27 21:39:08 · 1955 阅读 · 0 评论 -
实现string类拷贝构造函数和赋值构造函数
一个简单的string类需要哪些成员呢?默认构造函数;big three(拷贝构造、拷贝复制、析构)一个char*指针成员#include <bits/stdc++.h>using namespace std;"hello");class my_string{public: my_string(const char *cstr = NULL); my_string(const my_string& str); my_string& o原创 2020-09-13 15:44:47 · 806 阅读 · 0 评论 -
calloc、malloc、realloc函数的区别
参考:realloc、malloc、以及calloc函数的区别_逐梦男孩-CSDN博客三者都是分配内存,都是stdlib.h库里的函数文章目录malloccallocreallocmalloc原型:void* malloc (size_t size);size为要申请的空间大小常见使用方式:int *p = (int *)malloc(20*sizeof(int));一般需要将返回的void*指针进行强制类型转换为所需类型指针。示例:/* malloc example: rando原创 2020-09-12 16:26:09 · 238 阅读 · 0 评论 -
面试知识点(C++)
仅作个人记录文章目录构造函数和析构函数是否可以抛出异常里氏原则shared_ptr里面引用计数是什么类型?c++内存空间有哪些段?std::move()默认拷贝构造函数是深还是浅?介绍static关键字。map和unordered_map的区别函数形参用 const & 来修饰,有什么好处?红黑树与平衡二叉树unique_ptr的独占式怎么实现?share_ptr引用计数有没有什么问题?怎么解决这个问题?函数内定义了一个share_ptr对象,但是函数内抛出异常了没有回来继续执行,会造成内存泄漏吗原创 2020-09-12 01:24:04 · 2414 阅读 · 0 评论 -
struct对齐规则
参考了:结构体在内存中的对齐规则 -CSDN博客先看这一段代码:struct A{ char a; int b; double c;};int main(){ A a; cout << sizeof(a) << endl; cout << &a << endl; cout << (void*)&a.a << " " << &a.b << " " << &a原创 2020-09-12 00:50:14 · 2555 阅读 · 0 评论 -
c++输出char类型变量的地址乱码的解决方案
今天vs2013上发现以下代码:char a = 'c';cout << &a << endl;的输出竟然不是地址,而是一串乱码 :”烫…“可以修改为:cout << (void *)&a << endl;进行强制转换,就可以正常输出了。原因是:cout重载了很多类型,对于char *,它会当作以’\0’结尾的字符串来处理。...原创 2020-09-11 23:55:59 · 2010 阅读 · 0 评论 -
c++在main()函数执行之前执行了那些操作?
一开始可能会有点懵,但是回想我们的代码,在main()函数之前一般会有哪些代码?比如库的包含(#include …),比如一些宏定义,全局变量的定义,想到这儿大体就有点思路了。函数执行之前,我们需要进行一些相关资源的分配,才能保证函数能够运行起来。具体来说:1、初始化栈的指针栈用于存储一些需要的局部变量或者其他数据2、静态变量或者全局变量的初始化3、如果全局变量未初始化,如果是内置类型会执行默认初始化,如果是非内置类型,会调用默认构造函数进行初始化4、main()函数的参数压栈(int argc原创 2020-09-11 20:35:01 · 3029 阅读 · 0 评论 -
c++标准输入输出流的进制表示以及进制之间的转换
dec是10进制 如cout << dec << b 就会把b转换成10进制再输出hex是16进制 如cout << hex << b 就会把b转换成16进制再输出oct 是 8 进制 如cout << oct << b 就会把b转换成8进制再输出同理:dec是10进制 如cin >> dec >> b 切换至十进制输入hex是16进制 如cin >> hex >> b 切换至十原创 2020-09-08 17:14:12 · 564 阅读 · 0 评论 -
c++几个小细节记录
今天熟悉牛客网的时候写了20个单选题,居然错了好几个。。。特此记录一下,突然做这种选择题感觉有点不一样。1、int *p1 = new int[10]; int *p2 = new int[10](); 这个比较简单:对于内置类型而言,new仅仅是分配内存,除非后面显式地加(),相当于调用它的构造函数对于自定义类型而言,只要一调用new,就会有三个动作:分配内存,调用默认构造函数初始化,返回指向该类型地指针所以:p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化2、下面的程序可原创 2020-09-08 15:38:22 · 224 阅读 · 0 评论 -
关于lower_bound函数的一些理解
参考:lower_bound - C++ Reference函数功能:返回一个迭代器,该迭代器指向区间内第一个不小于val的元素,如果没有,就返回end。可以理解为返回的是下界。两种形式:第一个版本使用默认的 < 进行比较:template <class ForwardIterator, class T> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& v原创 2020-08-26 10:19:28 · 2268 阅读 · 0 评论 -
图的简单实现(C++)
数据结构与算法:30 | 图的表示数据结构与算法:31 | 深度和广度优先搜索写的比较乱,也不完善,后续再慢慢加:#include <iostream>#include <vector>#include <algorithm>#include <queue>#include <stack>#include <cassert>using namespace std;class Graph{public:原创 2020-08-24 10:57:25 · 444 阅读 · 0 评论 -
C++类里面vector声明错误:“expected parameter declarator“
今天在写Trie树的时候:LeetCode第 208 题:实现Trie(前缀树)(C++)发现这样的声明:struct TrieNode{ char data; bool isEnd = false; vector<TrieNode*> children(26);//想申请大小为26的数组 TrieNode(char data) : data(data){};};会报错:expected parameter declarator <font>原创 2020-08-04 20:58:35 · 13410 阅读 · 6 评论 -
STL容器迭代器失效总结
本文只总结常见的序列容器(vector、deque、list)和关联容器(set、multiset、map、multimap)的迭代器失效问题。原迭代器指的是进行操作之前保存的迭代器,包括begin()、end()以及其他位置的迭代器。vector:成员函数push_back():会在容器末尾添加一个元素。如果容器有剩余空间(capacity() > size()),则直接添加新元素到容器尾部。此时,原迭代器中end()会失效,其他的都不会失效。否则,会导致容器重新分配内存,然后将数据从原内存复转载 2020-07-30 15:06:39 · 244 阅读 · 0 评论 -
二叉搜索树的C++实现
主要包含删除、插入和搜索三个操作,关于操作的解释,可以看这里:二叉树基础(下)直接贴代码://二叉搜索书结点类型template<class T> struct BSTNode{ T data; //数据域 BSTNode<T> *left, *right; BSTNode() :left(NULL), right(NULL){} BSTNode(const T d, BSTNode<T>* L = NULL, BSTNode<T>* R =原创 2020-07-21 12:46:52 · 298 阅读 · 0 评论 -
二叉树的各种遍历方式(C++)
文章目录前序遍历递归法迭代法(使用栈)中序遍历递归法迭代法(使用栈)后序遍历递归法迭代法层次遍历二叉树深度遍历和广度遍历:深度遍历有前序、中序以及后序广度遍历即层次遍历,需要其他数据结构支撑(比如队列)二叉树的遍历通常采用递归方式,但是有一些题目会要求使用迭代的方式,所以最好都掌握一下。关于遍历方式的定义和理解就不阐述了。二叉树节点很简单:// Definition for a binary tree node. struct TreeNode { int val;原创 2020-07-21 22:15:03 · 455 阅读 · 0 评论 -
快速排序的多种实现方式
文章目录双指针法快排:一趟排序将要序列分割成独立的两部分,一部分的所有数据都比另外一部分的所有数据都要小,按此方法再对这两部分数据分别进行快速排序,整个排序过程可以递归进行。void quickSort(vector<int> &a, int beg, int end){ if (beg >= end) return; auto q = partition(a, beg, end); //获取分区结点 quickSort(a, beg, q-1); quickSor原创 2020-07-11 14:57:43 · 1221 阅读 · 0 评论 -
C++单链表及其简单插入删除的简要实现
#include <iostream>using namespace std;// 用结构体表示结点typedef struct node{ char name[20]; int age; struct node *next;}Person;// 创建链表// 参数n:结点数量Person *createList(int n){ Person *head = new Person; //头结点,一般不存储数据 Person *pre = head; for (in原创 2020-06-28 14:55:15 · 609 阅读 · 0 评论 -
二叉搜索树(包含重复数据)的C++实现
由这个修改:二叉搜索树的C++实现_qq_32523711的博客-CSDN博客删除的时候我是递归删除的(感觉有点偷懒)//二叉搜索树结点类型template<class T> struct BSTNode{ T data; //数据域 BSTNode<T> *left, *right; BSTNode() :left(NULL), right(NULL){} BSTNode(const T d, BSTNode<T>* L = NULL, BSTNode原创 2020-07-22 21:51:28 · 909 阅读 · 0 评论 -
堆以及堆排序简单实现(C++)
学习这一章节之后,自己试着实现了以下:数据结构与算法之美:28 | 堆和堆排序:为什么说堆排序没有快速排序快?很多地方处理的比较仓促:#include <iostream>#include <vector>using namespace std;//大顶堆(基于vector)template<class T>class Heap{public: Heap(); //默认构造 Heap(int cap); //构造大小为cap的堆 Heap(ve原创 2020-07-29 16:35:58 · 355 阅读 · 0 评论 -
IP地址与无符号整数的转换
IP地址可以转换为32位的无符号整数:192.18.3.1:以.为分隔,将每个部分存入数组a[4]unsigned int ans = (a[0] << 24) + (a[1] << 16) + (a[2] << 8) + a[3];简要代码(IP存储在string中)unsigned int IPToValue(const string &strIP){ int a[4]; string ip = strIP; for (int i = 0;原创 2020-07-14 22:06:16 · 1015 阅读 · 0 评论 -
xxxx iterator not dereferencable问题
最近老出现这个问题,基本就是因为访问了空的位置(迭代器位置错误)下面两种形式记得选择第一种!!!while(it != a.end() && *it < item){ ++it;while(*it < item && it != a.end()){ ++it;...原创 2020-07-12 17:21:02 · 293 阅读 · 0 评论 -
c++ vector关于push_back()调用构造函数、析构函数的分析
vector的push_back()、emplace_back等改变空间大小的操作,调用构造函数、析构函数的次数分析!!!先看这个初始代码:#include <iostream>#include <vector>using std::cout; using std::endl;struct X{ X() {cout << "调用构造函数:X...原创 2019-09-30 15:49:04 · 6190 阅读 · 6 评论