经典书籍学习
未读一个容器就是一些特定类型对象的集合。 顺序容器(sequentialcontainer) 指实现能按顺序访问的数据结构,它为程序员提供了控制元素存储和访问顺序的能力。 这种访问顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。与之相对的,将在第11章介绍的有序和无序关联容器,则根据关键字的值来存储元素。
标准库还提供了三种容器适配器,分别为容器操作定义了不同的接口,来与容器类型适配,将在本章末尾介绍适配器。
所有容器类都共享公共的接口,不同容器按不同方式对其进行扩展。 这个公共接口使容器的学习更加容易——基于某种容器所学习的内容也都适用于其他容器。每种容器都提供了不同的性能和功能的权衡。
概述下表列出了标准库中定义的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。但是,这些容器在以下方面都有不同的性能折中:
向容器添加或从容器中删除元素的代价
非顺序访问容器中元素的代价
顺序容器类型
介绍
vector
可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢
deque
双端队列。支持快速随机访问。在头尾位置插入/删除速度很快
l ...
题目总计有 n 个环,环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。
给你一个长度为 2n 的字符串 rings ,表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 ,用于描述每个环:
第 i 对中的 第一个 字符表示第 i 个环的 颜色('R'、'G'、'B')。
第 i 对中的 第二个 字符表示第 i 个环的 位置,也就是位于哪根杆上('0' 到 '9')。
例如,"R3G2B1" 表示:共有 n == 3 个环,红色的环在编号为 3 的杆上,绿色的环在编号为 2 的杆上,蓝色的环在编号为 1 的杆上。
找出所有集齐 全部三种颜色 环的杆,并返回这种杆的数量。
示例 1:
1234567输入:rings = "B0B6G0R6R0R6G9"输出:1解释:- 编号 0 的杆上有 3 个环,集齐全部颜色:红、绿、蓝。- 编号 6 的杆上有 3 个环,但只有红、蓝两种颜色。- 编号 9 的杆上只有 ...
经典书籍学习
未读C++语言不直接处理输入输出,而是通过一组定义在标准库中的class类型,即 流类类型(stream class type) 来处理IO操作。这些类支持从设备读取数据、向设备写入数据的IO操作,设备可以是文件、控制台窗口等,还有一些类允许内存IO,即,从内存读取数据,向内存写入数据。
IO 库定义了读写内置类型值的操作。除此之外,一些类,比如 string ,通常也会定义类似的IO操作,来读写class类型自己的对象。
istream 输入流类型,提供输入操作。
ostream 输出流类型,提供输出操作。
cin 一个 istream 对象,从标准输入读取数据。
cout 一个 ostream 对象,向标准输出写入数据。
cerr 一个 ostream 对象,用户输出程序错误消息,写入到标准错误。
>> 运算符,用来从一个 istream 对象读取输入数据。
\<< 运算符,用来从一个 ostream 对象写入输出数据。
getline函数,从一个给定的 istream 读取一行数据,存入一个给定的 string 对象中。
IO类
头文件
类型
iost ...
IP协议是TCP/IP协议族的核心协议,也是socket网络编程的基础之一,本章节从两部分较为深入地探讨IP协议:
IP头部信息
IP头部信息出现在每个IP数据报中,用于指定IP通信的源端数据IP地址、目的端IP地址、指导IP分片和重组、以及指定部分通信行为
IP数据报的路由和转发
IP数据报的路由和转发发生在除目标机器之外的所有主机和路由器上,他们决定数据报是否应该转发以及如何转发
IP服务的特点IP协议是TCP/IP协议族的动力,他为上层协议提供无状态、无连接、不可靠的服务。
无状态
指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立,没有上下文关系的。缺点是无法处理乱序和重复的IP数据报。
优点是简单高效,无须为保持通信的状态分配一些内核资源,也不需要每次传输数据时都携带状态信息。
无连接
指IP通信双方都不长久维持对方的任何信息,这样上层协议每次发送数据的时候,都必须明确指定对方的IP地址
不可靠
不能保证IP数据报准确地到达接收端,他只是承诺尽最大努力。发送端的IP模块一旦检测到IP数据报发送失败,就通知上层协议发送失败,而 ...
经典算法
未读算法二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。
实现12345678910111213141516171819202122232425262728293031323334namespace sorting{ template<typename T> int64_t binary_search(std::vector<T> &arr,T val, int64_t low,int64_t high){ if(high<=low){ return (val>=arr[low])?low+1:low; } int mid = low+(high-low)/2; if(arr[mid]>val){ ...
经典算法
未读算法冒泡排序是一个比较简单和经典的排序算法,他的原理就是:
重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
实现1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>#include<vector>using namespace std;int main(){ int n; cout<<"enter the amount of the numbers to sort:"; cin>>n; vector<int> numbers; cout<<"enter "<<n<<" numbers: "; int num; fo ...
经典书籍学习
未读网络应用随处可见。任何时候浏览 Web、发送 email 信息或是玩在线游戏,你就正在使用网络应用程序。有趣的是,所有的网络应用都是基于相同的基本编程模型,有着相似的整体逻辑结构,并且依赖相同的编程接口。
网络应用依赖于很多在系统研究中已经学习过的概念。例如,进程、信号、字节顺序、内存映射以及动态内存分配,都扮演着重要的角色。还有一些新概念要掌握。我们需要理解基本的客户端 - 服务器编程模型,以及如何编写使用因特网提供的服务的客户端—服务器程序。最后,我们将把所有这些概念结合起来,开发一个虽小但功能齐全的 Web 服务器,能够为真实的 Web 浏览器提供静态和动态的文本和图形内容。
客户端-服务器模型每个网络应用都是基于客户端—服务器模型的。釆用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。例如,一个 Web 服务器管理着一组磁盘文件,它会代表客户端进行检索和执行。一个 FTP 服务器管理着一组磁盘文件,它会为客户端进行存储和检索。相似地,一个电子邮件服务器管理着一些文件,它为客户端进行读和更新。
...
现在Internet(因特网)使用的主流协议族是TCP/IP协议族,它是一个分层、多协议的通信体系。本章简要讨论TCP/IP协议族各层包含的主要协议,以及它们之间是如何协作完成网络通信的。
TCP/IP协议族包含众多协议,我们无法一一讨论。本书将在后续章节详细讨论IP协议和TCP协议,因为它们对编写网络应用程序具有最直接的影响。本章则简单介绍其中几个相关协议:ICMP协议、ARP协议和 DNS协议,学习它们对于理解网络通信很有帮助。
TCP/IP协议族体系结构和主要协议TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层,网络层,传输层和应用层,每一层完成不同的功能,通过若干协议来实现,上层协议使用下层协议提供的服务,如图所示:
数据链路层常用协议是ARP协议和RARP协议,他们实现了IP地址和机器物理地址(通常是MAC地址)之间的互相转换
网络层使用IP地址寻址一台机器,而数据链路层使用物理地址寻址一台机器,因此网络层必须先将目标机器的IP地址转化为物理地址,才能使用数据链路层提供的服务,这就是ARP协议的用途。
网络层网络层实现数据包的选路和转发。WAN(广域网)使用众 ...
经典书籍学习
未读这里进入第三部分:程序间的交互和通信。我们学习计算机系统到现在,一直假设程序是独立运行的,只包含最小限度的输入和输出。然而,在现实世界里,应用程序利用操作系统提供的服务来与 I/O 设备及其他程序通信。
本书的这一部分将使你了解 Unix 操作系统提供的基本 I/O 服务,以及如何用这些服务来构造应用程序,例如 Web 客户端和服务器,它们是通过 Internet 彼此通信的。你将学习编写诸如 Web 服务器这样的可以同时为多个客户端提供服务的并发程序。编写并发应用程序还能使程序在现代多核处理器上执行得更快。当学完了这个部分,你将逐渐变成一个很牛的程序员,对计算机系统以及它们对程序的影响有很成熟的理解。
输入/输出(I/O)是在主存和外部设备(例如磁盘驱动器、终端和网络)之间复制数据的过程。输入操作是从 I/O 设备复制数据到主存,而输出操作是从主存复制数据到 I/O 设备。
所有语言的运行时系统都提供执行 I/O 的较高级别的工具。例如,ANSIC 提供标准 I/O 库,包含像 printf 和 scanf 这样执行带缓冲区的 I/O 函数。C++ 语言用它的重载操作符 <&l ...
Naming遵循合理的命名方式应遵循易于读写,并可准确表达代码意图的命名方式
不应出现下列情况:
超长的名称
易造成混淆或冲突的名称
无意义或意义过于空泛的名称
不易于读写的名称
有违公序良俗的名称
示例:
1234567891011int xxx(int); // Bad, meaningless nameint fun(int); // Bad, vague nameint l, I, O, l0, Il; // Bad, like numbersint YE5, N0; // Bad, like a word but notint \u540d\u79f0; // Bad, no readabilityint nVarietyisthespiceoflife = 123; // Bad, hard to read or write
例中 xxx、fun 这种无意义或意义过于空泛的名称,以及 l、lI、N0 这种易与数字或其他单词混淆的名称均是不符合要求的;Unicode 转义名称只应出现在字符串中,否则没有可读性;名称中各单词间 ...