- 博客(160)
- 资源 (2)
- 问答 (6)
- 收藏
- 关注
原创 网络编程:IO复用TCP循环服务器(简单时间服务器)
网络编程:IO复用TCP循环服务器(简单时间服务器)写在前面的话IO复用循环服务器指,建立两个线程一个用于处理连接,处理好之后放到文件状态表中,一个用于处理客户端请求,用select监听处理好的连接,处理结束后将连接移出文件状态表。该模型不会产生过多进程(线程)导致过多的上下文切换。参考教材:Linux网络编程。题目(功能)服务端:接收客户端时间请求,返回本地时间客户端:发送时间请求,接收客户端返回的时间并打印服务端代码#include <sys/types.h>#inclu
2022-04-29 20:03:48
108
原创 网络编程:单客户端单线程统一accpet TCP并发服务器(简单时间服务器)
网络编程:单客户端单线程统一accpet TCP并发服务器(简单时间服务器)写在前面的话由主进程统一的处理客户端连接,当客户端连接到来时才创建子线程来处理客户端请求。参考教材:Linux网络编程。题目(功能)服务端:接收客户端时间请求,返回本地时间客户端:发送时间请求,接收客户端返回的时间并打印服务端代码#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#incl
2022-04-29 20:03:17
145
原创 网络编程:单客户端单进程统一accpet TCP并发服务器(简单时间服务器)
网络编程:单客户端单进程统一accpet TCP并发服务器(简单时间服务器)写在前面的话由主进程统一的处理客户端连接,当客户端连接到来时才fork()子进程来处理客户端请求。参考教材:Linux网络编程。题目(功能)服务端:接收客户端时间请求,返回本地时间客户端:发送时间请求,接收客户端返回的时间并打印服务端代码#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#
2022-04-29 20:02:51
1151
原创 网络编程:TCP循环服务器(简单时间服务器)
网络编程:TCP循环服务器(简单时间服务器)写在前面的话循环服务器指对于客户端的连接,服务器处理完一个之后接着处理另一个。即串行处理。要熟悉代码流程,并区别于UDP循环服务器。参考教材:Linux网络编程。题目(功能)服务端:接收客户端时间请求,返回本地时间客户端:发送时间请求,接收客户端返回的时间并打印服务端代码#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>
2022-04-29 19:40:09
639
原创 网络编程:UDP循环服务器(简单时间服务器)
网络编程:UDP循环服务器(简单时间服务器)写在前面的话循环服务器指对于客户端的连接,服务器处理完一个之后接着处理另一个。即串行处理。要熟悉代码流程,这是最简单的服务器模式。参考教材:Linux网络编程。题目(功能)服务端:接收客户端时间请求,返回本地时间客户端:发送时间请求,接收客户端返回的时间并打印服务端代码#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#
2022-04-29 19:38:53
531
原创 网络编程:UDP 客户端服务端简单例子
网络编程:UDP 客户端/服务端简单例子写在前面的话该例子较为简单,适合网络编程小白学习,用于了解UDP下C/S服务模式编程的流程。参考教材:Linux网络编程(第二版)题目(功能)客户端:1.向服务端发送测试字符串“UP TEST”。2.接受服务端发送的数据并打印服务端:2.接收服务端发送的数据。2.将接收到的数据返回发送给客户端服务端代码#include <sys/types.h>#include <sys/socket.h>#include <netin
2022-04-28 16:52:00
352
原创 网络编程:TCP 客户端服务端简单例子
网络编程:TCP 客户端/服务端简单例子写在前面的话该例子比较简单,注释得也比较仔细。适合小白学习网络编程。了解TCP下C/S模型编程的基本流程,后续学习,复杂功能其实在process_xx函数实现即可。参考教材:Linux网络编程(第二版)前置知识:1.多进程:fork()函数 2.linux:标准输入0,标准输出1,标准错误2 3.socket:几个常用API题目(功能描述)客户端:1.客户端连接连接服务端后,从标准输入字符串发送给客户端。2.接收到客户端消息后打印出接收到的消息服务端
2022-04-28 15:52:18
344
原创 条款 41 :了解隐式接口和编译器多态
条款 41 :了解隐式接口和编译器多态面向对象编程总是以显式接口和运行期多态来解决问题。我们看下面的代码:class Widget{ public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); virtual swap(Widget& other); ...};void doProcessing(Wid
2021-11-28 23:06:20
173
原创 Lambda表达式
Lambda表达式Lambda表达式是一个可以调用的代码单元,可以将其理解为一个未命名的匿名函数。与普通函数类似,一个Lambda有一个返回类型,参数列表和一个函数体,但是不同的是,Lambda可以定义在函数内部。Lambda表达式如下:[capture list](parameter list)->return type{function body}[capture list] :表示Lambda所在函数的局部变量的列表,一般为空。其余和一般函数无差别。Lambda可以忽略参数列表
2021-11-28 23:05:50
1296
原创 LeetCode 430 | 扁平化多级双向链表
LeetCode 430 | 扁平化多级双向链表题目题解第一次没有理解对题目,看错了要求,用了队列,扁平化后的顺序不合题目要求,不过幸苦敲的,还是记录一下队列的实现代码:/*// Definition for a Node.class Node {public: int val; Node* prev; Node* next; Node* child;};*/class Solution {public: Node* flatt
2021-11-27 16:32:08
459
原创 LeetCode 138 | 复制带随机指针的链表
LeetCode 138 | 复制带随机指针的链表题目题解用map给新申请的结点和原结点建立意义对应的关系,之后一次遍历map通过first(原结点)方便对second(新建的结点)修改。/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { val = _val; nex
2021-11-21 14:45:21
313
原创 LeetCode 234 | 回文链表
LeetCode 234 | 回文链表题目题解将链表的问题转化为数组问题,然后利用双指针解决,花了O(n)空间/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr)
2021-11-21 14:33:32
320
原创 LeetCode 328 | 奇偶链表
LeetCode 328 | 奇偶链表题目题解遍历链表,用两个向量表示两个子链表,然后合并,不是原地修改,花了O(n)的空间。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(n
2021-11-21 11:37:10
335
原创 LeetCode 203 | 移除链表元素
LeetCode 203 | 移除链表元素题目题解基本思想就是遍历链表,遇到相等的就删除,关键是引入哑结点,工作指针保持在待检查的元素前面,保证能进行删除操作。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x)
2021-11-19 23:27:49
3467
原创 LeetCode 142 | 环形链表 II
LeetCode 142 | 环形链表 II题目题解用哈希表:访问过的结点都放在哈希表里,每次访问结点前检查结点是否在里面,如果在那么该返回的就是这个节点了。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Sol
2021-11-18 22:41:39
303
原创 LeetCode 707 | 设计链表
LeetCode 707 | 设计链表题目题解就是最基础的链表,直接上代码//C++单向链表模板class MyLinkedList{private: struct ListNode { int val; ListNode *next; ListNode(int x):val(x),next(nullptr){} }; ListNode* head;public: MyLinkedList():head(
2021-11-18 21:08:24
375
原创 LeetCode 19 | 删除链表的倒数第N个结点
LeetCode 19 | 删除链表的倒数第N个结点题目题解解法1:一次遍历求出链表长度,然后就简单了,代码很简单/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr)
2021-11-13 22:54:22
214
原创 LeetCode 11 | 盛水最多的容器
LeetCode 11 | 盛水最多的容器题目题解解法一:暴力两层循环,找出最大的盛水量,很显然会超时class Solution {public: int maxArea(vector<int>& height) { int ans=0; for(int i=0;i<height.size()-1;++i){ for(int j=i+1;j<height.size();++j){
2021-11-13 22:33:06
551
原创 LeetCode 6 | Z字形变换
LeetCode 6 | Z字形变换题目题解按行遍历:思路:分析题目可以发现整个字符串按Z形变换被分成了numRows行(前提:s.size()>numRows),所以我们按照Z形变换的方式一次构建每一行,我们用curRow代表当前所处行,可以发现每当curRows=0或numRows-1是才会改变按行依次构建的遍历方向。class Solution {public: string convert(string s, int numRows) { if(nu
2021-11-12 20:12:01
4096
原创 条款 40 :明智而省慎地使用多重继承
条款 40 :明智而省慎地使用多重继承Use multiple inheritance judiciously.多重继承是C++的一个特色。对于多重继承,C++社群也有两种观点,一种认为多重继承是好的,另一种则认为应不要使用多重继承。我们来看一段多重继承的代码:class BorrowableItem{//图书馆允许你借某些东西 public: void checkOut();//离开时进行检查 ...};class ElectronicGadget{ pr
2021-11-12 18:24:30
686
原创 条款 39 :明智而省慎地使用private继承
条款 39 :明智而省慎地使用private继承Use private inheritance judiciouslyprivate继承并不意味着一种is-a关系。我们来看看代码://和条款32,这次改用private继承class Person{...};class Student:private Person{...};//private继承void eat(const Person& p);//人都会吃void study(const Student& s);//学生
2021-11-12 18:24:01
123
原创 条款 38 :通过复合塑模出has-a或“根据某物实现出”
条款 38 :通过复合塑模出has-a或“根据某物实现出”Model “has-a” or “is-implemented-in-trems-of” through composition.**复合(composition)是类型之间的一种关系,当某种类型对象内含有其他类型对象时就是这种关系。**它实际上意味着一种has-a关系或“根据某物实现出”。这节不想写,下次一定...
2021-11-12 18:23:11
67
原创 条款 37 :绝不重新定义继承而来的缺省参数值
条款 37 :绝不重新定义继承而来的缺省参数值Never redefine a function’s inherited default parameter value我们在条款36刚刚说过继承non-virtual函数是错误的。所以本条款更确切的说是:绝不重新定义继承而来的带有缺省参数值的virtual函数。理由很明确:virtual是动态绑定,而缺省参数是静态绑定动态绑定又叫后期绑定,静态绑定又叫前期绑定。我们来复习一下两者区别吧:我们先说一下静态类型和动态类型的概念:对象的所谓静态类型就是
2021-11-12 18:22:16
405
原创 条款 36 :绝不重新定义继承而来的non-virtual函数
条款 36 :绝不重新定义继承而来的non-virtual函数Never redefine an inherited non-virtualfunctionclass B{ public: void f(); ...};class D:public B{...};D x;//x是一个类型为D的对象//1B* pB=&x;//获得一个指针指向xpB->f();//经由该指针调用f//2D* pD=&x;//获得一个指针指向xpD->
2021-11-12 18:21:45
253
原创 条款 34 :区分接口继承和实现继承
条款 30 :考虑virtual函数以外的其他选择Consider alternative to virtual functions假设你在写一个游戏,其中有一个反映人物血量状态的函数,不同的人物有不同的生命计算方式,所以将其声明为virtual;我们没有声明为pure virtual意味着我们该给他一份缺省实现。class Game{ public: virtual int healthValue()const;//返回人物健康指数
2021-11-12 18:18:51
78
原创 LeetCode 3 | 无重复字符的最长字串
LeetCode 3 | 无重复字符的最长字串题目题解想法很简单,遍历字符串,在每一个位置检查以该字符开始能够生成的最长子串。用到容器set。class Solution {public: int lengthOfLongestSubstring(string s) { int len=0; set<char> myset; for(int i=0;i<s.size();++i){ myset.cl
2021-11-07 20:55:40
41
原创 条款 33 :避免遮掩继承而来的名称
条款 33 :避免遮掩继承而来的名称Avoid hiding inherited names.我们先来看看什么是遮掩:int x;fun(){ double x; cin>>x;}对于上面的代码来说我们输入的是double型的x,而不是int型的。因为他被遮掩了。C++的名称遮掩规则(name-hiding rules)所做的唯一事情就是:遮掩名称。至于名称是不是相同的类型并不重要。从上面的例子也能看出来。我们来看看继承中的名称遮掩:class Bas
2021-10-24 14:02:59
151
关于C语言static的问题
2022-08-24
关于Cmake的使用
2022-08-08
关于c++ RTTI的问题
2022-08-06
redis库没法引入
2022-08-02
c++ bind和function的问题
2022-07-16
关于c/c++输入输出的问题
2022-07-14
关于makefile引入头文件出错的问题
2022-05-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人