经典算法
未读算法思想
从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<iostream>#include<vector>using namespace std;const int &INF=100000000;void floyd(vector<vector<int> > &distmap,//可被更新的邻接矩阵,更新后不能确定原有边 vector<vector<int> > &path)//路径上到达该点的中转点//福利:这个函数没有用除INF外的任何全局量,可以直接复制!{ const int &N ...
我们这里不介绍进程池
概述创建一组子线程,运行着相同的代码和属性,任务到来时,主线程通过某种方式选择一个子线程为之服务,方法有两种:
随机算法或轮流选取算法
工作队列
处理多客户这里用进程的概念去解释:
在使用进程池处理多客户任务时,首先要考虑的一个问题是﹔监听 socket和连接socket是否都由主进程来统一管理。回忆第8章中我们介绍过的几种并发模式,其中半同步/半反应堆模式是由主进程统一管理这两种 socket的;而半同步/半异步模式,以及领导者/追随者模式,则是由主进程管理所有监听socket,而各个子进程分别管理属于自己的连接socket 的。对于前一种情况,主进程接受新的连接以得到连接socket,然后它需要将该socket传递给子进程(对于线程池而言,父线程将socket传递给子线程是很简单的,因为它们可以很容易地共享该socket。)。后一种情况的灵活性更大一些,因为子进程可以自己调用accept来接受新的连接,这样父进程就无须向子进程传递socket,而只需要简单地通知一声:“我检测到新的连接,你来接受它。”
如果客户任务存在上下文关系,最好使用同一个子线程去服务 ...
经典书籍学习
未读多态在C++中主要由继承和多态实现,这一机制主要在运行期间起作用,因此称为动态多态,模板的多态发生在编译期间,我们称之为静态多态。
动态多态这里不过多解释,就是C++类与对象的重点知识点:
静态多态
12345template<typename Geoobj>void myDraw (Geoobj const& obj) // Geo0bj is template parameter{ obj.draw (); }
动态多态中,Geoobj是基类,静态多态的Geoobj是模板名
我们实现几个类的时候,不再使用层级结构的几何类,而是彼此独立的类
对比C++中的动态多态有如下优点:
可以很优雅的处理异质集合。
可执行文件的大小可能会比较小(因为它只需要一个多态函数,不像静态多态那样,需要为不同的类型进行各自的实例化)。
代码可以被完整的编译;因此没有必须要被公开的代码(在发布模板库时通常需要发布 模板的源代码实现)。
作为对比,下面这些可以说是 C++中 static 多态的优点:
内置类型的集合可以被很容易的实现。更通俗地说,接 ...
本章内容包括:
创建线程和结束线程
读取和设置线程属性
同步方式:信号量、互斥锁和条件变量
创建线程和结束线程pthread_create创建线程所使用的函数:
12#include <pthread.h>int pthread_create ( pthread_t* thread,const pthread_attr_t* attr,void*〔*start_routine) ( void* ) , void* arg );
thread参数是新线程的标识符,后续pthread_*通过它来引用新线程,是一个整型类型
attr参数设置新线程的属性,给他传递NULL表示使用默认线程属性
后面两个参数分别表示指定新线程将运行的函数及其参数
pthread_exit12include <pthread.h>void pthread_exit ( void* retval ) ;
pthread_join一个进程的所有线程都可以调用这个函数去回收其他线程
12#include <pthread.h>int pthread_join ( pthread ...
经典书籍学习
未读介绍一些模板的基本术语
类模板还是模板类关于该如何称呼一个是模板的类,有一些困扰:
术语 classtemplate 是指这个 class 是模板。也就是说它是一组 class 的参数化表达。
术语 templateclass 则被:
用作 classtemplate 的同义词。
用来指代从 template 实例化出来的 classes。
用来指代名称是一个 template-id(模板名 +<模板参数>)的类。
替换、实例化、特例化
在处理模板相关的代码时,C++编译器必须经常去用模板实参替换模板参数。
用实际参数替换模板参数,以从一个模板创建一个常规类、类型别名、函数、成员函数或者 变量的过程,被称为“模板实例化”。
通过实例化或者不完全实例化产生的实体通常被称为特例化
唯一定义法则C++语言中对实体的重复定义做了限制。这一限制就是“唯一定义法则,目前只要记住以下基础的 ODR 就够了:
常规(比如非模板)非 inline 函数和成员函数,以及非 inline 的全局变量和静态数据成 员,在整个程序中只能被定义一次。
Class 类型(包含 s ...
经典算法
未读原理在一些应用问题中,需要将n个不同的元素划分成一些不相交集合。
开始时,每个元素自成一个单元素集合,然后按照一定的规律将归于同一组的元素合并。在此过程中要反复用到查询某一个元素归属于哪个集合的运算。
初始状态
初始状态下,有九个元素,自成一个集合。
其中有三个分组:{0,6,7,8} {1,4,9}{2,3,5}
我们设置0,1,2为根节点:
数组表示为如下所示:
其中:
数组的下标对应集合中元素编号
数组元素如果为负数,则该节点为根节点,绝对值指该集合中元素的个数
数组中如果为非负数,则代表该元素的父亲在数组的下标
我们将{1,4,9}集合并入{0,6,7,8}集合
总结一下可以解决的问题:
查找元素属于哪个集合
查看两个元素是否属于同一集合
将两个集合归并成一个集合
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767 ...
基本概念
它们的名字由关键字 operator 和其后要定义的运算符号共同组成。和其他函数一样,重载的运算符也包含返回类型、参数列表以及函数体 。
重载运算符函数的参数数量和该运算符的运算对象数量一样多:
一元运算符有一个参数,二元运算符有两个。对于二元运算符来说,左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数。
除了重载的函数调用运算符 operator() 之外,其他重载运算符不能含有默认实参。
如果一个运算符函数是成员函数,则它的第一个(左侧)运算对象绑定到隐式的 this 指针上,因此,成员运算符函数的(显式)参数数量比运算符的运算对象总数少一个。
对于一个 运算符函数 来说,它或者是类的成员,或者至少含有一个类类型的参数——这一约定意味着当运算符作用于内置类型的运算对象时,我们无法改变该运算符的含义。
通常情况下我们将运算符作用于类型正确的实参,从而间接调用重载的运算符函数,但我们也可以调用普通函数一样调用运算符函数:
非成员函数
12data1 + data2;operator+(data1,data2);
成员函数
12data1+=da ...
信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。
对于前台进程,用户可以通过输入特殊的终端字符来给他发送信号,比如ctrl c
系统异常 比如浮点异常和非法内存段访问
系统状态变化 比如定时器发出的信号
kill命令或调用kill函数
概述发送信号Linux中一个进程给其他进程发送信号的API函数是kill
123#include <sysitypes.h>#include <signal.h>int kill(pid_t pid, int sig ) ;
pid指的是目标进程,sig指的是信号。
信号处理方式目标进程收到信号时,需要定义一个接收函数来处理,原型如下:
12#include <signal.h>typedef void ( *.__sighandler_t) ( int );
Linux信号与网络编程比较相关的有SIGHUP、SIGPIPE、SIGURG
信号函数signal系统调用要为一个信号设置处理函数,可以使用下面的signal系统调用:
12#include <signal. ...
包含模式链接错误大多数 C 和 C++程序员都会按照如下方式组织代码:
类和其它类型被放在头文件里。其文件扩展名为.hpp(或者.h,.H,.hh,.hxx).
对于全局变量(非 inline)和函数(非 inline),只将其声明放在头文件里,定义则被放在一个当作其自身编译单元的文件里 。这一类文件的扩展名为.cpp( 或 者.C,.c,.cc,.cxx)。
这样做效果很好:既能够在整个程序中很容易的获得所需类型的定义,同时又避免了链接过程中的重复定义错误。
受这一惯例的影响,刚开始接触模板的程序员通常都会遇到下面这个程序中的错误。和处理 “常规代码”的情况一样,在头文件中声明模板:
1234567#ifndef MYFIRST_HPP #define MYFIRST_HPP // declaration of template template<typename T> void printTypeof (T const&); #endif //MYFIRST_HPP
其中 printTypeof()是一个简单的辅助函数的声明,它会打印一些类型相关信息。 ...
这周的工作是阅读C++模板和Linux服务器编程 每日一题 以及一些经典算法
读完了苏菲的世界,准备听书听西方哲学史,字面书籍的话看理想国
每日一题我以后只会发比较有难度的题,不然太多了
汤圆这周偷吃鸡骨头了,半夜狂吐,真的没睡好