经典书籍学习
未读对非类型模板参数,待定的不再是类型,而是某个数值。在使用这种模板时需要显式的指出待定数值的具体值,之后代码会被实例化。本章会通过一个新版的 Stack 类模板来展示这一特性。顺便也会介绍一下函数模板的非类型参数。
类模板的非类型参数作为和之前章节中 Stack 实现方式的对比,可以定义一个使用固定尺寸的 array 作为容器的 Stack。这种方式的优点是可以避免由开发者或者标准库容器负责的内存管理开销。不过对不同应用,这一固定尺寸的具体大小也很难确定。如果指定的值过小,那么 Stack 就会很容易满。如果指定的值过大,则可能造成内存浪费。因此最好是让Stack 的用户根据自身情况指定 Stack 的大小。
123456789101112131415161718192021222324#include <array> #include <cassert> template<typename T, std::size_t Maxsize> class Stack { private: std::array<T, Maxsize& ...
示例总图我们按照如下方法来部署通信实例:
在Kongming20上运行wget客户端程序,在ernest-laptop 上运行squid代理服务器程序。客户端通过代理服务器的中转,获取Internet 上的主机www.baidu.com的首页文档index.html,如下图所示。
wget客户端程序和代理服务器之间,以及代理服务器与Web服务器之间都是使用HTTP协议通信的,HTTP协议是一种应用层协议,默认使用的传输层协议是TCP协议
squid代理服务器接收到wget客户端的HTTP请求后,将简单修改这个请求,把他发送给目标的的Web服务器。
http的连接过程,不太好做笔记
经典书籍学习
未读标准库容器的定义操作集合很小,但是标准库提供了一组独立于特定容器的算法,他们是泛型的,可用于不同类型的容器和不同类型的元素
概述大多数标准库算法都定义在头文件algorithm中
一般情况下,这些算法并不直接操作容器,而是遍历由两个迭代器指定的一个元素范围来进行操作。通常情况下,算法遍历范围,对其中每个元素进行一些处理。
虽然迭代器的使用令算法不依赖于容器类型,但大多数算法都使用了一个(或多个)元素类型上的操作。
例如,在步骤2中, find 用元素类型的 == 运算符完成每个元素与给定值的比较。而其他算法可能要求元素类型支持 < 运算符。不过,在后面将会看到,大多数算法提供了一种方法,允许程序员使用自定义的操作来代替默认的运算符。
定制操作及lambda很多标准库算法都会比较输入序列中的元素。默认情况下,这类算法使用元素类型定义的 < 或 == 运算符完成比较。标准库还为这些算法定义了额外的版本,允许程序员提供自己定义的操作来代替默认运算符。
向算法传递函数作为一个例子,假定希望在调用elimDups(参见10.2.3)后打印 vector 的内容。此外还假定希望单 ...
题目给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
示例 1:
123输入:nums = [3,10,5,25,2,8]输出:28解释:最大运算结果是 5 XOR 25 = 28.
示例 2:
12输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]输出:127
提示:
1 <= nums.length <= 2 * 105
0 <= nums[i] <= 231 - 1
解答首先有一个贪心的思想:
尽可能让高位是1,这样结果肯定更大
其次异或运算有一个结论:
a~i~ XOR a~j~ = x 可以推出x XOR a~i~ = a~j~
方法一 哈希表即我们从高位开始往低位推,假设该位是1,让他这个值与num中的其他值异或,如果结果哈希表能找到,那么就说明该位是1,保留下来该值。
12345678910111213141516171819202122232425262728293031323334353637383940 ...
题目给定一个二叉树:
123456struct Node { int val; Node *left; Node *right; Node *next;}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。
初始状态下,所有 next 指针都被设置为 NULL 。
示例 1:
123输入:root = [1,2,3,4,5,null,7]输出:[1,#,2,3,#,4,5,7,#]解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。
示例 2:
12输入:root = []输出:[]
提示:
树中的节点数在范围 [0, 6000] 内
-100 <= Node.val <= 100
解答层序遍历
123456789101112131415161718192021222324252627282930class ...
经典算法
未读算法归并排序有两个基本的操作,一个是分,也就是把原数组划分成两个子数组的过程。另一个是治,它将两个有序数组合并成一个更大的有序数组。
基本思路:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105/** * \addtogroup sorting Sorting Algorithms * @{ * \file * \brief [Merege Sort Algorithm * (MEREGE SORT)](https://en.wikipedia.org/ ...
经典算法
未读算法桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。桶排序是鸽巢排序的一种归纳结果。
实现123456789101112131415161718192021222324252627282930313233343536// C++ program to sort an array using bucket sort#include <algorithm>#include <iostream>#include <vector>// Function to sort arr[] of size n using bucket sortvoid bucketSort(float arr[], int n) { // 1) Create n empty buckets std::vector<float> *b = new std::vector&l ...
经典书籍学习
未读和函数类似,类也可以被一个或多个类型参数化,容器类就是典型的一个例子,它可以被用来处理某一指定类型的元素,通过使用类模板,你也可以实现适用于多种类型的容器类,本章用一个stack的例子来展示:
Stack类模板的实现1234567891011121314151617181920212223242526272829303132#include <vector> #include <cassert> template<typename T> class Stack { private: std::vector<T> elems; // elements public: void push(T const& elem); // push element void pop(); // pop element T const& top() const; // return top element bool empty() const { // return whether ...
TCP协议时TCP/IP协议族另一个重要的协议,和IP协议相比,TCP协议更靠近应用层
本章节分为四个部分:
TCP头部信息。TCP头部信息出现在每个TCP报文段中,用于指定通信的源端端口号、目的端端口号,管理TCP连接,控制两个方向的数据流。
TCP状态转移过程。TCP连接的任意一端都是一个状态机。在TCP连接从建立到断开的整个过程中,连接两端的状态机将经历不同的状态变迁。理解TCP状态转移对于调试网络应用程序将有很大的帮助。
TCP数据流。通过分析TCP数据流,我们就可以从网络应用程序外部来了解应用层协议和通信双方交换的应用程序数据。这一部分将讨论两种类型的TCP数据流:交互数据流和成块数据流。TCP数据流中有一种特殊的数据,称为紧急数据,我们也将简单讨论之。
TCP数据流的控制。为了保证可靠传输和提高网络通信质量,内核需要对TCP数据流进行控制。这一部分讨论TCP数据流控制的两个方面:超时重传和拥塞控制。
TCP服务的特点传输层协议主要有两个:TCP协议和UDP协议。TCP协议相对于UDP协议的特点是:面向连接、字节流和可靠传输。使用TCP协议通信的双方必须先建立连接,然后才 ...