![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 63
ShininGold
这个作者很懒,什么都没留下…
展开
-
STL容器是否是线程安全的
1) stl的线程安全.说一些关于stl容器的线程安全相关的话题。一般说来,stl对于多线程的支持仅限于下列两点:(貌似Effective STL中有描述)1.多个读取者是安全的。即多个线程可以同时读取一个容器中的内容。 即此时多个线程调用 容器的不涉及到写的接口都可以 eg find, begin, end 等.2.对不同容器的多个写入者是安全的。即多个线程对不同容器的同时写入合法。但是对于同一容器当有线程写,有线程读时,如何保证正确?需要程序员自己来控制,比如:线程A读容器某一项时.转载 2021-05-13 17:31:20 · 1602 阅读 · 0 评论 -
Sizeof详解
近期遇到很多关于sizeof的问题,现在统一归纳一下。一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。 它并不是函数。 sizeof操作符以字节形式给出了其操作数的存储大小。 操作数可以是一个表达式或括在括号内的类型名。 操作数的存储大小由操作数的类型决定。原创 2017-03-14 12:04:23 · 1130 阅读 · 0 评论 -
KMP算法详解
字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上转载 2017-03-16 00:14:18 · 219 阅读 · 0 评论 -
C++Primer第五版——习题答案+详解(完整版)
C++Primer第五版——习题答案详解 新手入门必看的书。知识是一个系统化并且相互关联的体系,零散的东西每天收获如果不形成自己的体系的话,那将是毫无意义的,所以我觉得有必要将这本书先啃一遍,消化其中的关键有用的东西,了解相关但是目前不那么重要的东西。博客不是我的目的,将这本书中的知识啃透才是我的目标!共勉! 看的不快不慢,有很多东西暂时确实用不上,转载 2017-03-14 22:01:33 · 3166 阅读 · 0 评论 -
哈希表和红黑树的对比
什么是HashHash,也可以称为“散列”,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出(也就是多对一的关系)。哈希表的构造在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找。而哈希表就是利转载 2017-04-13 02:02:58 · 1115 阅读 · 0 评论 -
函数声明后面的const用法
void function() const{}通常我们会看到一些函数声明后面会跟着一个const,这个const是做什么的呢?看一下下面的例子,就知道了。直接在编译前,就会提示下面的两个错误// test1107.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;cl原创 2017-05-19 10:43:22 · 442 阅读 · 0 评论 -
寻找数组中最小的k个数(快排和堆排)
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即是比k位置小的数组,k后面的数即是比k位置元素大的数组。思路2:利用堆排序,特别适用于海量数据中寻找最大或者最小的k个数字。即构建一个大堆容器,初始化大小为k,变量初始数,如初原创 2017-06-29 13:14:07 · 1207 阅读 · 0 评论 -
浅谈字节对齐和具体实例
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果原创 2017-08-05 15:22:55 · 330 阅读 · 0 评论 -
C++main函数参数以及含义
关于main(int argc, char *argv[])以下摘录一小段:argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 命令行后面跟的用户输入的参数,比如: int main(int argc, char* argv[]) { int i;原创 2017-09-13 19:01:02 · 559 阅读 · 0 评论 -
输入一个满二叉树的深度和它的三个节点,求三个节点最小子树的,根节点
例如:输入深度为4,三个子节点分别为10,13,15,最小子树的根节点为12.我们可已根据树的遍历方式推测出这是一个中序遍历值为从1到2^k-1。我们可以用二分搜索技术来找最小子树的根节点。[cpp] view plain copy//基于二分搜索 #include #include int FindMin(原创 2017-08-30 01:05:36 · 897 阅读 · 0 评论 -
常用的排序算法总结
查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这些排序可原创 2017-03-13 21:20:04 · 405 阅读 · 0 评论 -
HashMap与冲突解决算法
hash_map是经常被使用的一种数据结构,而其实现方式也是多种多样。如果要求我们使用尽可能简单的方式实现hash_map,具体该如何做呢?我们知道hash_map最重要两个概念是hash函数和冲突解决算法。hash_map键-值之间的映射关系,hash函数将键映射为内存地址,冲突解决算法用于解决不同的键映射为相同地址时候的情况。数据结构和算法导论中介绍了大量的hash函数和冲突解决算法,原创 2017-03-13 16:01:02 · 693 阅读 · 0 评论 -
erase容器中元素的原则
1. 对于关联容器(如map, set, multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。for (iter = cont.begin(); it != cont.end();){ (原创 2017-02-28 17:24:17 · 239 阅读 · 0 评论 -
inline解析
(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。 inline int min(int first, int secend) {/****/}; inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline函数不同的是,转载 2017-03-02 10:55:12 · 312 阅读 · 0 评论 -
指针和const
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性指向常量的指针:const int *pa;int const *pa;两者等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性:*pa =d; // 不可行(d是已经声明过的整型)但原创 2017-02-25 15:03:20 · 183 阅读 · 0 评论 -
析构函数为什么要是虚函数
原因:基类对象的指针操作派生类对象时,防止析构函数只调用基类的,而不调用派生类的 下面详细说明://基类 class A{ public : A(){ cout"A构造函数"endl; } ~A(){cout"A被销毁了"endl;} void Do(){ cout"A要做点什么"endl;原创 2017-02-25 01:11:31 · 5885 阅读 · 0 评论 -
虚函数与纯虚函数
虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数!纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。class Cman{public:virtual void Eat(){……};void Move();pr原创 2017-02-25 15:42:40 · 342 阅读 · 0 评论 -
局部静态变量Static详解
在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其 初始化为0。静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局原创 2017-03-10 18:01:40 · 49294 阅读 · 3 评论 -
详细讲解二叉树三种遍历方式的递归与非递归实现
二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的)。下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现。一、三种遍历方式转载 2017-03-11 14:18:52 · 255 阅读 · 0 评论 -
C++ 类的静态成员详细讲解
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即::。 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和原创 2017-04-07 14:40:20 · 294 阅读 · 0 评论 -
2017网易游戏笔试
刚刚做完网易笔试题,就写出了两题,趁脑子还清醒,写下来记住。第一题代码:#includeusing namespace std;int main(){ int M, N, x, y, i, j; cin >> M >> N; int *a = new int[M]; for (i = 0; i < M; i++) a[i] = 0;//初始化硬币起始状态 while原创 2017-03-20 21:32:37 · 1400 阅读 · 0 评论 -
【设计模式】工厂模式
工厂模式作用:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。UML结构图:抽象基类:1) Product:创建出来的对象的抽象基类.2) Factory创建对象的工厂方法的抽象基类.接口函数:l)Creator::FactoryMethod:纯虚函数,由派生类实现,创建出对应的Produc原创 2017-03-13 00:43:54 · 294 阅读 · 0 评论 -
【设计模式】抽象工厂模式
抽象工厂模式: 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。UML结构图:抽象基类:1)ProductA,ProductB:分别代表不同类型的产品,而它们的派生类则是这种产品的一个实现.2)AbstractFactory:生产这一系列产品的一个抽象工厂,它的派生类是不同的实现.接口函数:1)AbstractFactory::原创 2017-03-13 00:57:08 · 232 阅读 · 0 评论 -
strcpy函数的实现
已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。(1)不调用C++/C的字符串库函数,请编写函数 strcpychar *strcpy(char *strDest, const char *strSrc);{原创 2017-02-28 10:22:18 · 239 阅读 · 0 评论