c++
文章平均质量分 71
Greetlist
这个作者很懒,什么都没留下…
展开
-
mmap 进程间通讯
文章目录mmap代码注意点知识点mmapmmap可以把一个文件映射到进程内存里面,之后操作这块内存就相当于操作文件,文件存在于文件系统里面,不同的进程都能读取这个文件,所以mmap就可以当作IPC来使用。代码这里写了一个producer和consumer来模拟mmap在不同的进程之间共享数据。msg.h#ifndef MSG_H#define MSG_H#define MMAP_FILE "test_mmap"#define MSG_ARRAY_SIZE 4096#include &原创 2021-06-28 11:23:36 · 800 阅读 · 1 评论 -
C++ 11(二)
1.标准库函数: begin 和 end : 这两个函数不是成员函数,正确的使用形式就是把数组当作参数,begin返回指向数组的首元素的指针,end返回指向数组尾元 素下一个位置的指针,这两个函数定义在iterator头文件中 c++112.左值和右值: 当一个对象当作右值的时候,那么使用的是它的内容,当一个对象当作左值的时候,那么就是利用它的内存位置。3.处理复合表达原创 2016-04-23 20:41:27 · 379 阅读 · 0 评论 -
对象的集合--队列,使用链表来实现
1.队列是一种基于先进先出策略的集合类型(FIFO)2.我们可以使用原始数组来完成一个队列的构造,但是我们使用链表当做队列的内部数据结构则更好,原因有两点:i.入队 和 出队 操作所需的时间跟集合大小无关。ii.所需空间跟集合大小成正比。原创 2016-12-16 15:14:34 · 705 阅读 · 0 评论 -
对象的集合--栈 ,使用链表来实现
1.之前的一篇文章里面写的是使用vector或者原始数组来实现一个栈,这篇文章则是使用链表来实现一个栈。2.使用链表来实现栈的好处在于:i.push 和pop 操作 都是与链表长度无关的。ii.所需的空间总是跟所要处理的数据的大小成正比。3.实现:list.hpp#ifndef LIST_HPP#define LIST_HPP#include原创 2016-12-13 23:22:13 · 483 阅读 · 0 评论 -
练习 -- 使用双向链表来实现双向队列
1.题目:使用一个双向链表来实现一个双向的队列,并且让队列具有以下的操作:(1)判断队列是否为空(2)得到双向队列中元素的个数(3)向左端添加一个新元素(4)向右端添加一个新元素(5)从左端删除一个元素(6)从右端删除一个元素2.分析:有了双向链表,我们就可以创建我们自己的双向队列,并且很容易地就能实现上面的操作3.代码:doubleli原创 2016-12-21 14:09:19 · 1311 阅读 · 0 评论 -
使用栈来实现括号匹配
1.题目:从标准输入中读取一个文本流并使用栈来判定其中的括号是否配对完整。例如:对于[()]{}{[()()]()} 打印 true;对于 [(]) 打印false。2.前提:已经定义好栈,只用构造解决函数即可。solution.hpp#ifndef SOLUTION_HPP#define SOLUTION_HPP#include "stack.hpp"原创 2016-12-16 17:27:15 · 437 阅读 · 0 评论 -
练习--实现双向链表
1.题目(算法p103-p104):实现一个双向链表,并且实现以下的函数:(1)在指定的节点之前插入节点(2)在指定的节点之后插入节点(3)删除指定节点(4)removeAfter(),接受一个链表节点作为参数,并删除该节点的后续节点(5)find(),接受一个key值,如果链表中某个节点的data域的值跟key相等,那么就返回true,否则返回false2.分原创 2016-12-20 17:33:04 · 451 阅读 · 0 评论 -
查找--二叉查找树
我们很多时候都在搜索,搜索相关电影的演员表,搜索相关英语单词的解释、含义,搜索特定人物的联系方式等等,我们为了解决这种问题,会使用到符号表这种工具,而符号表里面会有很多种不同的实现:比如说基于数组的符号表,基于树的符号表,这篇博客就是记录使用二叉树这种数据结构来实现一个符号表。1.概念:树这种数据结构,应该有很多人用过了,主要是由节点和指向节点的指针构成。我们可以回想一下在一个int数原创 2017-04-19 00:18:27 · 431 阅读 · 0 评论 -
OJ 287 -- Find the Duplicate Number
Description:Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicatenumber must exist. Assume that there is only o原创 2017-07-31 15:25:02 · 508 阅读 · 0 评论 -
KMP算法
1.字符串匹配:给定两个字符串S1, S2,我们需要确定S1里面是否包含S2,换句话说就是判断S2是否是S1的子串。 我们很容易想到的方法就是暴力搜索:从第一个字符开始匹配,如果不相等则顺序后移一位,再进行比较,伪代码为:n = s1.sizem = s2.sizefor i = 0 to n - m if s2[0 ... m-1] == s1[s ... s+m-1]原创 2017-08-09 00:31:04 · 381 阅读 · 0 评论 -
OJ 141 --Linked List Cycle
Description:Given a linked list, determine if it has a cycle in it.Follow up:Can you solve it without using extra space?描述:给定一个链表,写一个函数确定这个链表是否有环。空间复杂度为O(1)思路:链表有环,则最原创 2017-08-02 22:28:39 · 338 阅读 · 0 评论 -
C++ 11(八)
顺序容器:1.forward_list(单链表,单向顺序访问) 和 array 是新加入的类型。2.迭代器:在之前的版本中,我们如果需要一个const_iterator 那么我们只能这样写: Container::const_iterator,到了c++11,我们就可以直接这样写:c.cbegin()这个函数返回的是指向容器的第一个元素的const迭代器(底层const)。 c原创 2016-05-15 16:49:56 · 394 阅读 · 0 评论 -
C++11(九)
1.容器的动态增长:vector,string在内存容量不足以放置新的元素时,会动态地扩充内存,以减少重新开辟空间,复制元素,释放旧的空间的操作所带来的负面影响。有这么几个函数值得我们注意:capacity(),size(),resize(),reserve(),shrint_to_fit(),这三个函数有关于容器的大小,其中:(1)capacity():这个函数获得这个容器的容量,容量原创 2016-05-16 14:48:18 · 398 阅读 · 0 评论 -
算法导论第八章 -- 计数排序
1.算法基本思想:对于在待排序的数组里面的数字,记录小于它的元素的个数,那么记录下来的这个数字就是它在输出数组里面的位置了这里假设元素是互异的。2.如果元素不互异,那么就要对算法里面的一个记录数组作一些操作,以便保持算法的正确性。代码如下:countSort.h#ifndef COUNTSORT_H#define COUNTSORT_H#include原创 2016-04-19 22:49:47 · 762 阅读 · 0 评论 -
阅读STL源码剖析笔记 —— 迭代器概念
摘自侯捷老师的STL源码剖析:一些概念和自己理解的东西:1.iterator pattern :提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。2.STL的中心思想:将数据容器(数据结构) 和 算法 分开,彼此独立设计,最后再以一种粘合剂将它们绑在一起。3.iterator是一种smart pointer:迭代器是原创 2016-04-09 14:31:31 · 577 阅读 · 0 评论 -
阅读STL源码剖析笔记 —— vector
初步阅读vector 的摘要源码,我找到了一些我觉得挺重要的东西,在STL源码剖析里面,vector 的实现中有这么几个函数:void push_back(const T& x){ if (finish != end_of_storage) //finish 是我们经常用的end()函数返回的迭代器,end_of_storage 也是一个迭代器,表示可用空间的尾原创 2016-04-09 17:28:53 · 514 阅读 · 0 评论 -
c++ 11(四)
1.定义在类内部的函数是隐式的inline函数,this是一个常量指针,不允许改变this中保存的地址。2.const:成员函数有下面两种形式:MyClass::doSomething (int&) const;const MyClass::doSomething (std::string&);const MyClass::doSomething (std::vect原创 2016-04-26 23:35:59 · 460 阅读 · 0 评论 -
c++ 11(五)
1.explicit 只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,并且explicit 构造函数只能用于直接初始化,而不能用于 = 操作符。2.字面值常量类:要求:数据成员都必须是字面值类型,类必须至少含有一个constexpr构造函数,类必须使用析构函数的默认定义,内置类型成员的初始值必须是一条常量表达式。3.constexpr构造函数可以原创 2016-04-28 23:26:49 · 428 阅读 · 0 评论 -
C++ 11 (六)
1.流有着状态,IO库定义了一个与机器无关的iostate类型,它提供了表达流状态的完整功能,流有四种状态,badbit代表系统级错误,failbit表示一个IO操作失败,eofbit代表已经到了文件的结束,goodbit代表流是否发生错误,如果goodbit的值为0,那么就代表流未发生错误。当我们使用如下的代码时:while(cin >> word){}实际上,我们这行代码就等价于!原创 2016-05-11 11:32:16 · 463 阅读 · 0 评论 -
c++ 11(七)
1.string流:istringstream 代表字符串输入流,istringstream可以和一个字符串绑定,可以是自己创建的字符串,也可以是从getline函数得来的字符串#include #include #include int main(int arvc, char* argv[]){ std::string line; std::ifstream in(原创 2016-05-11 20:12:12 · 500 阅读 · 0 评论 -
算法导论第六章 -- 堆排序
堆排序:主要是二叉堆,是一个数组,可以近似看作是一棵完全二叉树。主要性质:1.对于任意一个下标index,书上写的是左子女的下标为 2 * index,右子女为 2 * index + 1;但是在实际编程中,下标是从0开始的,所以下标的变化应该为:左子女为2 * index + 1, 右子女为 2 * index + 2;2.最大(小)堆:对于任意一个非叶节点,它的原创 2016-04-17 16:51:28 · 471 阅读 · 0 评论 -
算法导论第七章 -- 快速排序
1.快速排序是一种直接在原来的数组上面进行排序的算法,不用另外开辟新的空间。任意选择一个元素,当作主元,把剩下的所有元素,比它大的放在右边,比它小的放在左边。2.最差时间复杂度是 O(n^2),造成最差时间复杂度的原因是:每一次的partition(划分子数组)都会造成不平衡的划分,都会划分成为n-1 个元素的子数组和0个元素的子数组,则每一次的运行时间加起来就是n^2。3.平均时原创 2016-04-18 16:23:57 · 529 阅读 · 0 评论 -
C++ 11(一)
c++ primer第三版看了两遍,没接触过 c++ 11 得特性,现在来看第五版,记下一些东西,模糊了的,忘记了的,才了解的1.long long 新定义数据类型,64位,有符号类型 c++112.仔细看字面值常量。3.一个引用只能绑定一个对象,不能令引用重新绑定到另外一个对象,引用必须初始化。4.nullptr 是一种特殊类型的字面值,它可以原创 2016-04-20 21:25:04 · 415 阅读 · 0 评论 -
C++ 11(三)
1.返回数组的指针: 1)函数可以返回数组的指针或引用 : int (* func ( int i ) ) [10] 表示:func这个函数需要一个int实参,并且我们可以对函数调用后的结果进行 解引用,并且解引用之后得到的是一个大小为10,元素类型为int型的数组。2)也可以使用尾置返回类型:尾置返回类型跟在形参列表后面并以一个 -> 符号开头,例如: auto fu原创 2016-04-25 20:14:10 · 415 阅读 · 0 评论