自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

IT呵呵哒的博客

菜鸟之路

  • 博客(57)
  • 资源 (1)
  • 收藏
  • 关注

原创 基于线程的回射服务器

客户端:#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <stdlib.h>

2018-04-30 15:17:58 228

原创 生产者消费者问题(共享内存实现)

问题描述:    生产者-消费者问题,也称作有界缓冲区问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行阻塞,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者还想去取消息,此时...

2018-04-30 10:58:18 4764 1

原创 哲学家就餐

“哲学家进餐”问题有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五个碗和五个刀叉,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的刀叉,只有在他拿到两支刀叉时才能进餐。进餐完毕,放下刀叉又继续思考。解决方法:    只有哲学家要么不拿,要么左右手均拿起刀叉。思路:    创建一个信号量为5的信号集,并将其全部初始化为1。定义两个刀叉变...

2018-04-30 08:42:49 258

原创 基于UDP的简单聊天室

聊天室功能:        1.其他用户上线通知。        2.其他用户下线通知。        3.获取在线列表。        4.用户之间点对点聊天。实现思想:        1.服务器端主要是解析客户端发送过来的各种指令,并作出相应的处理和回应。        2.客户端采用select管理套接口IO和标准输入IO,当有事件发生,做出相应的处理。        3.采用链表存储每个客...

2018-04-15 09:51:04 4861 11

原创 基于UDP协议的简单回射服务器的实现

                                        UDP客户/服务基本模型UDP特点:    1.无连接    2.基于消息的数据传输服务    3.不可靠    4.一般情况下UDP更加高效相关函数:      ssize_t  recvfrom(int sockfd,void *buff,size_t nbytes,int flags, struct sockad...

2018-04-08 19:03:44 410

原创 Socket编程--简单回射服务器的实现

TCP三次握手回射客户/服务器Socket函数1.包含头文件<sys/socket.h>2.功能:创建一个套接字用于通信3.原型        int socket(int domain,int type,int protocol);4.参数    domain:指定通信协议族   type:指定socket类型,流式套接字SOCK_STREAM(TCP),数据报套接字SOCK_DGR...

2018-03-19 15:51:35 1197 1

原创 条款20:宁以pass-by-reference-to-const替换pass-by-value

缺省情况下C++以by value方式(一个继承自c的方式)传递给对象至函数。除非你另外指定,否则函数都是以实际实参的复件为初值,而调用端获得的亦是函数返回值的一个复件。这些复件有对象的copy构造函数产出,这可能使得pass-by-value成为费时的操作。class Person{public: Person(); virtual ~Person(); .....

2019-06-04 21:45:16 168

原创 条款19: 设计class犹如设计type

C++就像在其他OOP(面向对象编程)语言一样,当你定义一个新class,也就定义了一个新type。身为C++程序员,你的许多时间主要用来扩张你的类型系统。这意味着你并不只是class设计者,还是type设计者。重载函数和操作符、控制内存的分配和归还、定义对象的初始化和终结......全部都在你手上。因此你应该带着和“语言设计者当初设计语言内置类型时”一样的谨慎来研讨class的设计。...

2019-05-28 22:02:07 238

原创 条款18:让接口容易被正确使用,不易被误用

欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑使用者可能做出什么样的错误。假设你为一个用来表现日期的class设计构造函数:class Data{public: Date(int month, int day, int year); ...}; 乍见之下这个接口通情达理。但是它的使用者很容易犯下至少两个错误。第一,他们也许会以错误的次序传递参...

2019-04-14 22:34:25 242

原创 条款17:以独立语句将newed对象置入智能指针

假设我们有个函数用来揭示处理程序的优先权,另一个函数用来动态分配所得的Widget上进行某些带有优先权的处理:int priority();void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); 现在考虑调用processWidget:processWidget(new Widget,...

2019-04-12 19:55:40 141

原创 条款16:成对使用new和delete时要采取相同形式

当你使用new(也就是通过new动态生成一个对象),有两件事发生。第一,内存被分配出来(通过名为 operator new的函数)。第二,针对此内存会有一个(或更多)构造函数被调用。当你使用delete,也有两件事发生:针对此内存会有一个(或多个)析构函数被调用,然后内存才被释放(通过名为 operator delete的函数)。delete的最大问题在于:即将被删除的内存之内究竟存有多少对象...

2019-04-10 20:47:04 125

原创 条款15:在资源管理类中提供原始资源的访问

当你使用智能如auto_ptr或std::tr1::share_ptr保存一个factory函数如createInvestment的调用结果时:std::tr1::shared_ptr<Investment> pInv(createInvestment()); 假设你希望以某个函数处理Investment对象,像这样:int daysHeld(const I...

2019-04-08 22:08:17 114

原创 条款14:在资源管理类中小心copying

假设我们使用C API函数处理类型为Mutex的互斥器对象,共有lock和unlock两函数可用:void lock(Mutex* pm); //锁定pm所指的对象void unlock(Mutex* pm); //将互斥器解除锁定 为确保绝不会忘记将一个被锁住的Mutex解锁,你可能...

2019-04-01 21:47:03 134

原创 条款13:以对象管理资源

假设我们使用一个用来塑模投资行为的程序库,其中各式各样的投资类型继承自一个root class Investment:class Investment{...}; //"投资类型",继承体系中的root class 假设这个程序库通过一个工厂函数提供我们特定的Investment对象:Investment* createInvesment();...

2019-03-30 15:31:05 169

原创 重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果, 请重建该二叉树。假设输入的前序遍历和中序遍历的结果汇总都不含有重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建如下 1 / \ 2 3 / / \ 4 5 6 \ / 7 ...

2019-03-25 21:28:39 97

原创 条款12:复制对象时勿忘其每一个成分

设计良好之面向对象系统会将对象的内部封装起来,只留下两个函数负责对象拷贝(复制),那便是带着适切名称的copy构造函数和copy assignment操作符,称之为copying函数。 考虑一个class用来表现顾客,其中手工写出(而非编译器创建)copying函数,使得外界对它们的调用会被记录下来:void logCall(const std::string& funcN...

2019-03-22 22:09:15 123

原创 条款11:在operator=中处理“自我赋值”

“自我赋值”发生在对象被赋值给自己时: class Widget{...};Widget w;... w = w; //赋值给自己以上是比较明显的赋值,也有一些赋值动作不总是那么可被一眼辨识出来,例如:a[i] = a[j]; 如果i和j有相同的值,这便是是个自我赋值。*px = *py;如果px和p...

2019-03-18 22:03:25 149

原创 条款10:令operator=返回一个reference to *this

关于赋值,你可以把它们写成连锁形式:int x,y,z;x = y = z = 15; //赋值连锁形式 因为赋值采用右结合律,所以上述赋值被解析为:x = (y = (z = 15)); 为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符左侧的实参。class Widget{public: ...

2019-03-17 22:24:32 234

原创 条款09:绝不在构造和析构过程中调用virtual函数

在C++中,不应该在构造函数和析构函数期间调用virtual函数。 这里有一个模拟股市交易的类:class Transaction{ //所有交易的base classpublic: Transaction(); virtual v...

2019-03-17 22:06:26 169

原创 条款08:别让异常逃离析构函数

C++并不禁止析构函数吐出异常,但它不鼓励你这样做。class Widget{public: ... ~Widget(){...} //假设这个可能吐出一个异常};void doSonmething(){ std::vector<Widget> v; ... //v在这里自动销毁...

2019-03-11 22:44:35 108

原创 条款07:为多态基类声明virtual析构函数

有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived classes作为不同的计时方法,相当合情合理:class TimerKeeper{public: TimeKeeper(); ~TimeKeeper(); ...};class AtomicClock:public TimeKeeper{...];...

2019-03-06 22:56:57 170

原创 条款06:若不想使用编译器自动生成的函数,就该明确拒绝

当你不想class支持某一特定机能,只要不声明对应的函数就是了。但是这个策略对copy构造函数和copy assignment操作符却不起作用,因为你不声明它们时,而某些尝试调用它们,编译器会自动生成。 所有编译器产出的函数都是public。为阻止这些函数被创建出来,你可以将copy构造函数或copy assignment操作符声明为private。阻止了编译器暗自创建其专属版本;而...

2019-03-04 21:04:58 138

原创 条款05:了解C++默默编写并调用哪些函数

什么时候empty class(空类)不再是个empty呢?当C++处理过它之后。如果你定义类的时候自己没有声明,编译器就会为它声明(编译器版本的)一个copy构造函数、一个copy assignment操作符和一个析构函数。如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数。所有这些函数都是public并且inline。例:class Empty{};...

2019-03-04 20:36:46 84

原创 条款04:确定对象被使用之前先被初始化

读取未初始化的值会导致不明确的行为。 在C++中,规则很简单:确保每一个构造函数都将对象的每一个成员初始化。class PhoneNumber{...};class ABEntry{ //ABEntry = "Address Book Entry"public: ABEntry(const std::string&amp; name...

2019-02-27 22:56:37 113

原创 条款03:尽可能使用const

  const的一件奇妙的事情是,它允许你指定一个语义约束(也就是指定一个“不该被改动的对象”),而编译器会强制实施这项约束。它允许你告诉编译器某值应该保持不变。 char greeting[] = "hello"; char *testStr = "world"; char *p = greeting; //non-const pointer,non-const data co...

2019-02-26 22:39:12 96

原创 条款02:尽量以const,enum,inline替换 #define

条款核心:宁可以编译器替换预处理器。#define ASPECT _RATIO 1.653  ASPECT _RATIO也许从未被编译器看见,在预处理阶段它就被预处理器移走了,所以ASPECT_RATIO有可能没进入记号表。解决之道是以一个常量替换上述的宏(#define)const double AspectRatio = 1.653;因为预处理器阶段只是盲目的替换,可能...

2019-02-25 22:19:01 136

原创 从尾到头打印链表

题目:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。链表节点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:首先我们肯定需要遍历链表,遍历的顺序是从头到尾,而输出的顺序是从尾到头。这是典型的“后进先出”,我们很容易就能想到栈这种数据结构可以实现这种顺序。每当我们经过一个节点,就把这个节点压入栈...

2019-02-14 16:45:57 79

原创 替换空格

题目:请实现一个函数,把字符创中的每个空格替换成“%20”,例如,输入“We are happy”,则输出"we%20are%20happy "。分析:我们可以先遍历一遍这个字符数组,统计出字符数组中的空格数量,并由此计算出替换之后的总长度。从前开始替换时,会有重复的移动。我们可以考虑从后开始替换,定义两个指针P1和P2,P1指向未替换字符数组的末尾,P2指向替换之后的字符数组的末尾,向前移动...

2019-02-11 10:28:17 105

原创 字符串

  字符串是有若干字符组成的序列。在C/C++中每个字符都以字符‘\0’作为结尾。为了节省内存,C/C++把常量字符放到单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上回指向同样的内存地址。但用常量内存初始化数组时,指向的内存地址会不一样。分析代码:// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。/...

2019-02-10 18:08:11 123

原创 二维数组中的查找

题目:在一个二维数组中,每一行都是按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如下面的二维数组就是每行、每列递增排序。如果在这个数组中查找数字7,则返回true,如果查找数字5,由于数组不含有该数字,则返回false。1   2   8     92   4   9    124   7 ...

2019-02-09 10:37:11 113

原创 不修改数组找出重复的数字

  题目:在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组至少有一个数字是重复的,请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。  分析:此题有两种方法。  方法一:因为不能改变输入的数组,我们可以定义一个长度为n+1的辅助数组,然后根据数组下标逐一把输入的数组的元素...

2019-02-04 11:22:59 490 1

原创 数组中的重复数字

  题目:在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意重复的数字。例如:如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出的重复的数字2或者3。分析:数组中的数字都在0~n-1之间,如果没有该数组中没有重复的数字,那么数组重新排序之后数字i出现的位置将是数组下标为i的位置...

2019-02-04 10:28:44 210

原创 赋值运算符函数

题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数class CMyString{public: CMyString(char *pData = nullptr); CMyString(const CMyString&amp; str);private: char *m_pData;};书中有四个方面的考虑,现总结如下:1.返回值的类型是否为该类...

2019-02-01 16:30:13 2436

原创 C++

问:定义一个空的类型,里面是没有任何成员的成员和成员函数。对该类型求sizeof,得到的结果是多少?答:1问:为什么不是0答:空的类型的实例中不包含任何信息,本来sizeof应该是0,但是当我们该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用内存的多少则有编译器决定。在Visual Studio,每个空类型的实例占用1字节的空间。问:如果在类型中...

2019-02-01 15:53:01 111

原创 国嵌数据结构学习之队列

队列的定义:    队列是一种特殊的线性表    队列仅在线性表的两端进行操作        队头(Front):取出数据元素的一端        队尾(Rear):插入数据元素的一端    注意:队列不予许在中间部位进行操作    应用:银行的取号排队队列的性质:    队列的一些常用操作:    创建队列    销毁队列    清空队列    进队列    出队列    获取对头元素    获...

2018-06-10 19:34:09 181

原创 sqlite数据库练习

表studentSno|Sname|Ssex|Sage|Sdept9512101|李勇|男|19|计算机系9512102|刘晨|男|20|计算机系9512103|王敏|女|20|计算机系9522101|张立|男|22|信息系9522102|吴宾|女|21|信息系9522103|张海|男|20|信息系9532101|钱小力|女|18|数学系9532102|王大力|男|19|数学系表courseCno...

2018-06-10 19:11:58 2260

原创 国嵌数据结构学习之栈的链式实现

栈的链式结构是用以前实现的可复用的单链表实现的,和栈的顺序结构区别仅仅在储存结构方面实现代码:    定义的头文件:#ifndef _LINKSTACK_H_#define _LINKSTACK_H_typedef void LinkStack;typedef struct _tag_LinkStackNode LinkStackNode;struct _tag_LinkStackN...

2018-06-10 19:09:13 114

原创 国嵌数据结构学习之栈

栈的定义:    栈是一种特殊的线性表    栈仅能在线性表的一端进行操作        栈顶:允许操作的一端        栈底:不允许操作的一端栈的性质:栈的操作:    创建栈    销毁栈    清空栈    进栈    出栈    获取栈的大小    获取栈顶元素栈的顺序实现:    国嵌实现的栈是用以前实现的顺序表复用实现的,这里可以感受到代码复用的好处,顺序栈的实现,用很少的代码就能...

2018-06-10 19:00:38 205

原创 sqlite数据库学习之基本操作

创建数据库:------&gt;sqlite test.db查看表sql结构:------&gt;.schema查看表:------&gt;.tables查看数据库:------&gt;.database对表操作:1.1.创建表:--&gt;create table 表名 (列名1 类型, 列名2 类型, 列名3 类型, 列名4 类型)---&gt;eg:create table human(id...

2018-06-04 16:24:10 168

原创 国嵌数据结构学习之双向链表

单链表的局限:    单链表的节点都只有一个指向下一个节点的指针。    单链表的数据元素无法直接访问其前驱元素(逆序访问单链表中的元素是及其耗时的操作)。双向链表的定义:    在单链表的节点中增加一个指向其前驱的pre指针。typedef void DLinkList;typedef struct _tag_DLinkListNode DLinkListNode;struct _tag_...

2018-06-03 19:15:06 117

UDP简易聊天室

1.其他用户上线通知。 2.其他用户下线通知。 3.获取在线列表。 4.用户之间点对点聊天。

2018-04-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除