版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+培训目录目录C+编码规范编码规范STL标准模板库进程线程以及socket通信Boost库makefile变量名规则变量构成方式变量作用域变量类型特殊情况命名的构成方式为命名的构成方式为变量作用域变量作用域 + 变变量类型量类型 + 基本名基本名在函数、事件等过程中例如循环中用在函数、事件等过程中例如循环中用到的临时变量可直接用到的临时变量可直接用i、j、k等形式等形式命名变量。命名变量。其他命名规则函数和过程Class(类)Structure(结构)Interface(Corba 接口)常数get_inputString()SRatedCdrIBusiAcceptMAX_DAY_COUNT
2、AILocalPlan注释源程序头注释源程序头注释函数或过程注释函数或过程注释代码修改注释代码修改注释其他注释其他注释/* Name : cccom.xpp Contents: This file defines the proxy for all communication classes. Also possible events and errors are defined. History: 2010/10/25 ReWe integration of missing return values 2010/10/14 Andreas Welsing #pragma pack() ins
3、erted 2010/06/13 ReWe all timers are set to -1 2009/10/25 ReWe first release*/* Parameters: None Return: CCEPPFW_OK CCEPPFW_ERROR Description: Close the EPP service*/ begin: 2010/11/14 XXX reason is 。/* 要删除的代码 */新增的代码/ end: 2010/11/14 XXX char sUserName30;/ the user name if( condition ) /your commen
4、ts目录目录C+编码规范STL标准模板库标准模板库进程线程以及socket通信Boost库makefileSTL简介 STL是c+标准程序库的核心,深刻影响了标准库的整体结构 STL是泛型程序库,利用先进、高效的算法来管理数据 STL由一些可适应不同需求的集合类,以及在这些数据集合上操作的算法构成 STL内的所有组件都由模板构成,其元素可以是任意类型STL组件 容器(Container) 管理某类对象的集合 迭代器(Iterator) 在对象集合上进行遍历 算法(Algorithm) 处理集合内的元素容器Container容器Container容器Container算法Algorithm迭代器
5、迭代器Iterator迭代器迭代器Iterator迭代器迭代器IteratorSTL容器类别 序列式容器排列次序取决于插入时机和位置插入时机和位置 关联式容器排列顺序取决于特定准则特定准则mapsetlistdequevectorvector容器 vector模拟动态数组 vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符) 必须包含的头文件#include vector支持随机存取 vector的大小(size)和容量(capacity)通常是不同的,capacity返回vector实际能容纳的元素数量。如果超过这个数量需要重新配置内
6、部存储器。vector元素操作#include #includeusing namespace std;void main()vector ivec; int x;while(cinx) ivec.push_back(x);for(vector:size_type i=ivec.size()-1;i!=0; i-) coutiveci “ ”; ivec.pop_back(); ivec.pop_front();cout“size:”ivec.size()“! last element is ”取用取用+将迭代器前进至下一元素将迭代器前进至下一元素=和和!=判断两个迭代器是否指向同一位置判断两
7、个迭代器是否指向同一位置=为迭代器赋值(将所指元素的位置赋值过去)为迭代器赋值(将所指元素的位置赋值过去)迭代器(iterator) 所有容器都提供获得迭代器的函数操作操作效果效果begin()返回一个迭代器,指向第一个元素返回一个迭代器,指向第一个元素end()返回一个迭代器,指向最后一个元素之后返回一个迭代器,指向最后一个元素之后begin()end()半开区间半开区间beg, end)的好处:的好处:1.为遍历元素时循环的结束时机提供了简单的判断依据(为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达只要未到达end(),循环就可以继续循环就可以继续)2.不必对空区间采取特殊处理
8、(不必对空区间采取特殊处理(空区间的空区间的begin()就等于就等于end())迭代器(iterator) 所有容器都提供两种迭代器 container:iterator以“读/写”模式遍历元素 container:const_iterator以“只读”模式遍历元素 迭代器示例:iteratorbegin()end() + posvector迭代器(ivec赋值好的vector)vector myvec(ivec);vector:iterator iter ; myvec.insert(myvec.end(),-1);myvec.insert(myvec.begin(),3,10);for(
9、vector:iterator iter = myvec.begin(); iter !=myvec.end(); +iter)coutiter“ “;list 使用双向链表管理元素 list的元素可以是任意类型T,但必须具备赋值和拷贝能力 必须包含的头文件#include list不支持随机存取,因此不提供下标操作符 在任何位置上执行元素的安插和移除都非常快。 安插和删除不会导致指向其他元素的指针、引用、iterator失效stack 后进先出(LIFO) #include 核心接口 push()将元素压栈 top()返回栈顶元素,但不移除 pop()从栈中移除栈顶元素,但不返回 实例:st
10、ackstacktop()pop()push()queue 先进先出(FIFO) #include 核心接口 push()将元素置入队列 front()返回队列头部元素,但不移除 back()返回队列尾部元素,但不移除 pop()从栈中移除元素,但不返回 实例:queuequeuefront()pop()push()back()STL算法 STL提供了一些标准算法来处理容器内的元素 搜寻、排序、拷贝、数值运算 STL的算法是全局函数 明确划分数据和操作 泛型函数式编程模式 所有算法可以对所有容器适用,甚至可以操作不同类型容器的元素 算法头文件 #include #include STL算法分类
11、 非变动性算法(nonmodifying algorithms) 变动性算法(modifying algorithms) 移除性算法(removing algorithms) 变序性算法(mutating algorithms) 排序性算法(sorting algorithms) 已序区间算法(sorted range algorithms) 数值算法(numeric algorithms)for_each()算法for_each(InputIterator beg,InputIterator end,UnaryProc op)对区间beg, end)中的每一个元素调用op(elem)返回op
12、之后的容器副本op可以改变元素op的返回值被忽略复杂度:线性,与区间元素个数成正比示例:foreachvoid show(int &element)std:cout element std:endl;int main() vector ivec; int xx;for(int i=0; ixx; ivec.push_back(xx);std:for_each(ivec.begin(),ivec.end(),show);IO流库 C+除了完全支持C语言的输入输出系统外,还定义了一套面向对象的输出输出系统。 为什么为什么C+要建立自己的输入输出系统?要建立自己的输入输出系统?流概念 流:数
13、据从一个对象流动到另一个对象,这种流动抽象为流。 流的操作:建立流、删除流、提取(读操作/输入)、插入(写操作/输出)。 最重要的stream: istream:定义input stream,用来读取数据 ostream:定于output stream,用来写出数据流类的基本结构iosostreamfstreamiostreamofstreamifstreamclogcerrcoutcinstreambufistream实例:分析程序结果#include void main()couta,bn;cout.put(a).put(,).put(b).put(n); char c1=A,c2=B;c
14、out.put(c1).put(c2).put(n);结果:a,ba,bABIO流作业std:cout “the sum of ” v1; “ and ” v2; “ is” v1+v2; std:endl;这段代码合法不?如果合法,为什么?反之,又为什么?目录目录C+编码规范STL标准模板库标准模板库进程线程及进程线程及socket通信通信Boost库makefile进程简介 进程是一个程序针对一组数据的一次执行 进程是整个系统中资源分配的最小单位 进程是系统调用的,系统处理机调度最小的单位 每个程序(命令)的运行都会产生一个进程 进程由程序、数据和进程控制块三部分组成进程的基本模型 主要状
15、态有3种:就绪状态,运行状态,阻塞状态挂起就绪挂起就绪挂起就绪挂起就绪活动阻塞活动阻塞运运 行行活动就绪活动就绪事件发生激活分派挂起超时事件发生等待事件激活挂起使用 fork 系统调用功能:创建一个新的进程功能:创建一个新的进程#include #include using namespace std;int main (void) pid_t p; /* fork returns type pid_t */ p = fork(); printf(fork returned %dn, p); fork returned 0fork returned 698进一步了解forkint main (
16、void) pid_t p;printf(Original program, pid=%dn, getpid();p = fork();if (p = 0) cout “In child process, pid= getpid() “,ppid=” getppid() endl; else cout “In parent, pid=“ getpid() “, fork returned = “ p 0)wait( (int *) 0); /父进程等待子进程的返回elseexit(0);Socket简介 Socket是进行程序间通信的BSD方法。 实际上是指一个通信端点,借助于它,用户所开发的
17、Socket应用程序,可以通过网络与其它Socket应用程序进行通信。 sockets是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点。它构成了在单个主机内及整个网际间的编程界面。工作原理图实例:服务端向客户端发Hello,you are connected!Socket地址结构定义struct in_addr unsigned long s_addr; struct sockaddrunsigned short sa_family; /地址簇char sa_data14; /14字节协议地址struct sockaddr_inshort in
18、t sin_family; /地址簇unsigned short int sin_port; /端口号struct in_addr sin_addr; /32位ip地址unsigned char sin_zero8; /实例服务端int client_fd, sin_size, sockfd; /创建socket,bind地址与端口,listen()省略while(1)sin_size=sizeof(struct sockaddr_in);if(client_fd=accept(sockfd,(struct sockaddr *)&remote_addr, &sin_size)
19、 =-1)cout“accept error”endl; continue;if(!fork()if(send(client_fd, ”Hello, you are connected!n”,26,0) = -1) cout“send error!”endl;close(client_fd); exit(0);close(client_fd);实例客户端int sockfd; char buf64;if(sockfd=socked(AF_INET,SOCK_STREAM,0)=-1)exit(1);if(connect(sockfd,(struct in_addr *)&serv_ad
20、dr,sizeof(struct sockaddr)=-1) exit(1);if(recevbytes=recv(sockfd,buf,100,0)=-1) exit(1);bufrecvbytes=“0”;cout“Received:”bufendl;close(sockfd);问题 服务器向客户端发送数据时,每次都要创建一个进程,当有N个客户端连接服务器的时候,服务器的资源就会紧缺,致使N+M的客户端不能连接,或服务器拷掉,该如何改善呢?使用线程,用线程代替进程使用线程,用线程代替进程线程简介 线程(thread)是进程的一个运行实体,一个CPU调度单位,其资源的拥有者是进程或任务。 一
21、个进程必须包含一个线程,称为主线程。进程中的线程是并行执行的。每个线程占用CPU的时间由系统来划分。线程的执行特征 基本状态:执行,就绪,挂起就绪就绪阻塞阻塞结束结束执行执行派生调度结束阻塞激活进程与线程间的同步方法临界区互斥量信号量事件在同一进程内使用,它的作用:保证只有一在同一进程内使用,它的作用:保证只有一个线程可以申请到该对象个线程可以申请到该对象与临界区的作用非常相似,但它可以跨越进与临界区的作用非常相似,但它可以跨越进程使用,故它需要的资源更多程使用,故它需要的资源更多一种资源计算器,一般有初始值,表进程一种资源计算器,一般有初始值,表进程/线线程可进入的数目,信号值大于零为有信号
22、状程可进入的数目,信号值大于零为有信号状态态用来通知其他进程用来通知其他进程/线程某件操作已经完成线程某件操作已经完成实例(初始化工作是线程安全的,信号量实现) #include #include boost/thread/once.h #include int i = 0; boost:once_flag flag =BOOST_ONCE_INIT; void init()+i; void thread()boost:call_once(&init, flag); int main( int argc, char * argv)boost:thread thrd1(&thre
23、ad); boost:thread thrd2(&thread);thrd1.join();thrd2.join();std:cout i std:endl;return 0; 线程实现socket通讯(服务端)使用boost的thread库int client_fd;/创建socket,bind地址与端口,listen省略while(1)int sin_size=sizeof(struct sockaddr_in);if(client_fd=accept(sockfd,(struct sockaddr *)&remote_addr, &sin_size) =-1)co
24、utaccept error!endl; continue;thread thr(bind(sendMsg,ref(client_fd);void *sendMsg(int& client_fd)if(send(client_fd, Hello, you are connected!n,26,0) = -1)coutsend error!endl;close(client_fd);作业用线程实现服务端(如前面的实例),服务器就处在不断创建与销毁线程的工作中,可通过线程池来改善,请用线程池重构服务端方法。提示:提示:1.boost:thread_group 2.list改进socket通
25、信l 对于socket通讯,stl标准库没有提供解决方案,但是boost库提供了相应的解决方法。l boost的asio库使用大量的类与函数封装了socket API。目录目录C+编码规范STL标准模板库进程线程以及socket通信Boost库库makefileBoost库简介 boost 是一个准标准库,相当于 STL 的延续和扩充,它的设计理念和 STL 比较接近,都是利用泛型让复用达到最大化。不过对比 STL , boost 更加实用。 STL 集中在算法部分,而 boost 包含了不少工具类,可以完成比较具体的工作。Boost主要的大类字符串及文本处理、容器、迭代子 (Iterator
26、) 、算法、函数对象和高阶编程、泛型编程、模板元编程、预处理元编程、并发编程、数学相关、纠错和测试、数据结构、输入 / 输出、跨语言支持、内存相关、语法分析、杂项。 容器 迭代器 类似于指针 优于指针 对于std:vector之类可以取下标操作的,如果是顺序访问的话,使用迭代器性能要优于直接取下标。容器 c+ tr1中的容器及boost实现 关于std:tr1 新标准,只是一个新的库 如果没有std:tr1:可以用boost:代替 boost:array boost:unordered_map boost:unordered_multimap boost:unordered_set boost
27、:unordered_multiset容器 boost:array 与std:vector非常相似 固定大小的数组,不可改变大小 有迭代器容器 boost:unordered_map、boost:unordered_multimap 与std:map / std:multimap几乎一样 唯一的区别就是以hash表的形式存放容器 boost:unordered_set、boost:unordered_multiset 与std:set / std:multiset几乎一样 唯一的区别就是以hash表的形式存放容器相关 其他 std:pair和boost:tuple std:pair只能有两个类
28、型 boost:tuple的类型是可变的 非C+0 x不超过10个、C+0 x可以任意多个 boost:tuple tuple:get - 获取第N个 make_tuple 函数算法 - algorithm (详见STL整理) 算法都是基于迭代器的 大部分算法中有一个Predicate 的参数 该参数可以是 函数指针 带有operator () 重载的类 仿函数从算法展开 仿函数 对于带有operator ()重载的类,称之为仿函数仿函数 调用起来跟普通函数一样 相比于函数,又有类的特点 可以带参数初始化 拷贝构造从算法展开 对于类的成员函数如何调用?template class mf0 pu
29、blic:typedef R (C:*mf_type) ();public:explicit mf0(mf_type f) : fn_(f) R operator () (C * p) const return (p-*fn_)();R operator () (C & u) const return (u.*fn_)();private:mf_type fn_;template mf0 mem_fn(R (C:*fn) ()return mf0(fn);template class mf1 public:typedef R (C:*mf_type) (A);public:explic
30、it mf1(mf_type f) : fn_(f) R operator () (C * p, A a) const return (p-*fn_)(a);R operator () (C & u, A a) const return (u.*fn_)(a);private:mf_type fn_;template mf1 mem_fn(R (C:*fn) (A)return mf1(fn);std:for_each(v.begin(), v.end(), mem_fn(&C:f);从算法展开 一个问题 如果函数/仿函数有多个参数,怎么办? 对于大多数算法都只处理一个参数 并
31、且每次有变化的也只有一个参数 使用boost:bind(或者std:tr1:bind)std:for_each(v.begin(), v.end(), boost:bind(&C:f, _1, others);boost:bind boost:bind是一个函数 返回一个仿函数 根据参数个数的不同返回不同类型的仿函数 调用方法:boost:bind(fn, .); _1, _2, , _9 是占位符, 代表调用时传给仿函数的第N个参数 boost:bind的参数是传值的 函数的第一个参数例外,可以是值也可以是指针接下来的几个问题 boost:bind的参数都是传值的,对于传引用的情况如
32、何解决。 boost:refboost:crefboost:function 采用前天提到的any实现的方法来实现的 主要的目的是能够减少模板的嵌套次数boost基础库 boost:any boost:tuple boost:utility 类型转换 - lexical_cast boost:bind / boost:functionboost其他库 日期时间库 boost:date_time 线程库 boost:thread 异步IO库(socket等) boost:asio 智能指针 smart_ptr 正则式 boost:regex tokenizer 随机数 boost:random线
33、程库 boost:thread 创建一个线程 最基本的办法 boost:thread th(FN); 利用线程池管理 boost:thread_group g;boost:thread* th = g.create_thread(FN);线程库 boost:thread 线程操作 等待线程结束 thread:join thread:timed_join thread_group:join_all 交权 让OS调度令外的线程 thread:yield 静态函数 睡眠 thread:sleep 静态函数线程库 boost:thread this_thread 命名空间 普通功能 get_id、sl
34、eep、yield at_thread_exit 中断处理 interruption_point、interruption_requested、interruption_enabled、disable_interruption、restore_interruption线程库 boost:thread 线程间通信 锁概念 Lockable Concept lock、try_lock、unlock TimedLockable Concept timed_lock SharedLockable Concept lock_shared、try_lock_shared、unlock_shared、tim
35、ed_lock_shared UpgradeLockable Concept线程库 boost:thread 线程间通信 锁类与方法 类 lock_guard unique_lock shared_lock upgrade_lock upgrade_to_unique_lock scoped_try_lock 仅用于mutex 方法 lock(Lockable1,Lockable2,.) lock(begin,end) try_lock(Lockable1,Lockable2,.) try_lock(begin,end)线程库 boost:thread 线程间通信 共享控制对象 mutex、t
36、ry_mutex、timed_mutex、recursive_mutex、shared_mutex condition_variable、condition_variable_any、condition barrier智能指针 smart_ptr boost:shared_ptrtokenizer tokenizer 这是一个容器类 类定义 tokenizer 构造函数 tokenizer(Iterator first, Iterator last,const TokenizerFunc& f = TokenizerFunc() templatetokenizer(const Cont
37、ainer& c,const TokenizerFunc& f = TokenizerFunc() TokenizerFunction char_separator escaped_list_separator offset_separatorboost实现socket通信(服务端)tryio_service ios;ip:tcp:acceptor acceptor(ios,ip:tcp:endpoint(ip:tcp:v4(),6688);while(true)ip:tcp:socket sock(ios);acceptor.accpet(sock);sock.write_s
38、ome(buffer(“hello asio!”);catch(std:exception &e)coute.what()endl;客户端void client(io_service &ios)tryip:tcp:socket sock(ios);ip:tcp:endpoint ep(ip:address:from_string(“127.0.0.1”),6688);sock.connect(ep);vector str(100,0);sock.read_some(buffer(str);cout&str0endl;catch(std:exception &e)coute.what()endl;目录目录C+编码规范STL标准模板库进程线程以及socket通信Boost库makefile什么是make? 程序的编译和链接源程序(.c/.cpp/.s)编译(compile)链接(linker)形成目标文件语法正确、变量和函数声明正确Windows:.objUNIX/Linux:.o形成可执行程序链接函数和全局变量,链接只关心目标文件。多个目标文件形成一个库Windows:.libUNIX/Linux:.a、.oM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 市政处安全生产责任制度
- 如何对生产设备管理制度
- 食品小作坊生产自查制度
- 危货企业安全生产制度
- 五金厂安全生产职责制度
- 2025 小学四年级科学上册四季的经济活动课件
- 2025 小学四年级科学上册光的数据分析课件
- 初中英语《书面表达》专项练习与答案 (100 题)
- 生产主体责任制三项制度
- 生产质量责任处罚制度
- 电磁辐射环境下的职业健康防护
- 2026年及未来5年中国芋头行业市场发展现状及投资方向研究报告
- 中药外洗治疗化疗导致外周神经毒课件
- 2025-2026学年人教版(新教材)小学数学三年级下册(全册)教学设计(附目录P208)
- 2025版中国慢性乙型肝炎防治指南
- 2026年及未来5年市场数据中国草酸行业发展前景预测及投资战略数据分析研究报告
- 感染科结核病防治培训指南
- 金属水幕施工方案(3篇)
- 2025美国心脏协会心肺复苏(CPR)与心血管急救(ECC)指南解读
- 2024-2025学年浙江省金华市兰溪市一年级(上)期末数学试卷
- 广东省珠海市香洲区2023-2024学年八年级上学期语文期末试卷(含答案)
评论
0/150
提交评论