玩转标准C++(stdc++).doc_第1页
玩转标准C++(stdc++).doc_第2页
玩转标准C++(stdc++).doc_第3页
玩转标准C++(stdc++).doc_第4页
玩转标准C++(stdc++).doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

知识共享-雕花系列玩转标准C+作者:Amos.Lan日期:2010-10-20核对:日期:版权:第 2 / 12页玩转标准C+前言前言关于此文档玩转标准C+主要是针对std c+中常用的一些工具类分别进行应用简述,结合常见用法的方式来分享经验,提供简易的入门认识或应用延伸探讨。如何使用此文档文档组织结构如下:章节 内容 一、字符串string、wstring的应用二、线性表vector、list、queue、stack的应用五、散列表map的应用字符串1. 字符串4 工具类名:std:string4 所在文件:string4 使用范例1、 用于存储字符串数据,字符串数据的编码格式可以为:单字字符编码(如Latin1)、其他不存在与0组合的双字或多字编码(如UTF8编码、BG2312编码、BGK编码等)int main(int argc, char* args)std:string ascii = “abcdefg”;std:string mix = “a字符串b”;printf(“text:%s”, ascii.c_str();printf(“text:%s”, mix.c_str();return 0;main.cpp文件编码格式可为UTF8、BG312、BGK等2、 功能扩展,支持字符串格式化struct string_ex : public stringinline string_ex & format(const char* _F, .)va_listargs;va_start(args, _F);vformat(_F, args);va_end(args);return *this;inline string_ex & vformat(const char* _F, va_list args)int _l = strlen(_F) * 2, _r = 0;resize(_l + 2);_r = vsnprintf(char*)(int)c_str(), _l, _F, args);while(_r 0)resize(_l*=2) + 2);_r=vsnprintf(char*)(int)c_str(),_l,_F, args); (char*)(int)c_str()_r = 0;return *this;4 工具类名:std:wstring4 所在文件:string4 使用范例1、 用于存储宽字字符串数据,字符串数据的编码格式可以为:宽字字符编码(如UTF16、UTF32等)。需要注意的是根据系统的不同,宽字类型也有所差异,具体要看wchar_t的定义,在大部分编译系统中wchar_t是两字节(即UTF16),而在某些编译系统中(如xcode 的MAC OS,iOS等高版本SDK中)则是四字节的(即UTF32),并且针对系统字序的不同可能会出现UTF16LE、UTF16BE、UTF16Native、UTF32LE、UTF32BE、UTF32Native等差异。int main(int argc, char* args)std:wstring ascii = L“abcdefg”;std:wstring mix = L“a字符串b”;wprintf(L“text:%s”, ascii.c_str();wprintf(L“text:%s”, mix.c_str();return 0;main.cpp文件编码格式可为UTF8、BG312、BGK等2、 功能扩展,支持字符串格式化struct wstring_ex : public wstringinline wstring_ex & vformat(const wchar_t* _F, va_list args)int _l = wcslen (_F) * 2, _r = 0;resize(_l + 2);_r = vsnwprintf(wchar_t *)(int)c_str(), _l, _F, args);while(_r0)resize(_l*=2)+2);_r=vsnwprintf(wchar_t *)(int)c_str(),_l,_F, args); (wchar_t *)(int)c_str() _r = 0;return *this;4 注意事项由于wchar_t类型的系统差异性,导致wstring不具备良好的系统可移植性。所以,如果要用到UTF16、UTF32并要考虑可移植性的话,最好自行维护一套字符串功能集。第 12 / 12页玩转标准C+线性表2. 线性表4 工具类名:std:vector4 所在文件:vector4 基本操作(以string类型为例)定义 :std:vectorvstrs;添加 :vstrs.push_back(“sdfsdf”);删除 :vstrs.erase(std:find(vstrs.begin(),vstrs.end(),“sdfsdf”);查找 :std:vector:iterator it = std:find(vstrs.begin(),vstrs.end(),“sdfsdf”); if(it != vstrs.end()printf(“found!”);取值 :printf(“index%d = %sn”, 0, vstrs0.c_str();遍历 :for(std:vector:iterator it = vstrs.begin(); it != vstrs.end(); it+)printf(“index%d = %sn”, it vstrs.begin(), (*it).c_str();4 使用范例1、 转换成为数组来操作(妙用)std:vectorvstrs;vstrs.push_back(asd);vstrs.push_back(dfg);std:string* p = (std:string*)&(* vstrs.begin();assert(p0 = asd);assert(p1 = dfg);4 注意事项1、 vector和数组一样会越界的,当使用运算符取值时,一定要确保索引值小于向量大小size()2、 由于vector删除某一个元素时可能会导致数据前移操作,所以vector不适合用于经常进行数据删除和顺序调整的场合工具类名:std:list4 所在文件:list4 基本操作(以string类型为例)定义 :std:listlstrs;添加 :lstrs.push_back(“sdfsdf”);删除 :lstrs.erase(std:find(lstrs.begin(),lstrs.end(),“sdfsdf”);查找 :std:list:iterator it = std:find(lstrs.begin(),lstrs.end(),“sdfsdf”); if(it != lstrs.end()printf(“found!”);遍历 :int i = 0;for(std:list:iterator it = lstrs.begin(); it != lstrs.end(); it+, i+)printf(“index%d = %sn”, i, (*it).c_str();排序 :lstrs.sort();4 使用范例1、 根据登录时间排序的用户列表typedef struct userlong atime; user;inline bool operator (const user& a, const user& b)return a.atime b.atime;std:listluser;luser.push_back(user(2, .);luser.push_back(user(3, .);luser.push_back(user(1, .);luser.sort();4 注意事项1、 关于排序问题。std:list本身提供的排序方法的,但是比较函数是取自于所定义的类型T对应的小于运算“”(如上面的std:string对应的inline bool operator (const std:string& a, const std:string& b);)。因此要定义一个新类型T的可排序列表,必须确保T的小于运算的正确性。比如上里给出的范例,如果我们如此定义用户列表“std:list luser”,则程序执行时真正比较的仅是两个指针的大小,而不是比较两个用户,这就是误用。4 工具类名:std:queue (先进先出)4 所在文件:queue4 基本操作(以string类型为例)定义 :std:queueqstrs;添加 :qstrs.push (“sdfsdf”);删除 :qstrs.erase(std:find(qstrs.begin(),qstrs.end(),“sdfsdf”);弹出 :skstrs.pop();查找 :std:queue:iterator it = std:find(qstrs.begin(),qstrs.end(),“sdfsdf”); if(it != qstrs.end()printf(“found!”);取值 :printf(“front = %sn”, qstrs.front().c_str();遍历 :int i = 0;for(std: queue :iterator it = qstrs.begin(); it != qstrs.end(); it+, i+)printf(“index%d = %sn”, i, (*it).c_str();4 使用范例1、 存储消息队列/*thread 1*/typedef struct msgint cmd; msg;std:queueqmsgs;qmsgs.push (msg (msg_init, .);qmsgs.push (msg (msg_login, .);qmsgs.push (msg (msg_exit, .);/*thread 2*/while(getmsg(&msg) dispatchmsg(&msg); 4 工具类名:std:stack (后进先出)4 所在文件:stack4 基本操作(以string类型为例)定义 :std:stackskstrs;添加 :skstrs.push (“sdfsdf”);删除 :skstrs.erase(std:find(skstrs.begin(),skstrs.end(),“sdfsdf”);弹出 :skstrs.pop();查找 :std: stack :iterator it = std:find(skstrs.begin(),skstrs.end(),“sdfsdf”); if(it != skstrs.end()printf(“found!”);取值 :printf(“top = %sn”, skstrs.top().c_str();遍历 :int i = 0;for(std: stack :iterator it = skstrs.begin(); it != skstrs.end(); it+, i+)printf(“index%d = %sn”, i, (*it).c_str();4 使用范例1、 解析HTML源代码(以下代码已忽略js脚本及代码语法错误,仅供参考)typedef struct tagint type; const char* pos; tag* next; tag* sub; tag;int parsehtml(const char* html, tag& root)std:stack stktags;stktags.push(&root(type_html, html);const char* pos = html;while(pick token from pos)if (token = )pick var1 from token;tag * n = new tag (typeof var1, address of var1)add n to stktags.top()-sub;stktags.push(n);decode property listelse if (token = )pick var1 from token;if(compare (var1, stktags.top()-pos) )stktags .pop(); tag endingelseerror(“syntax error”);elsemark token as in-tag contentreturn stktags.empty();散列表4 工具类名:std:map(映射表)4 所在文件:map4 基本操作(以string类型为例)定义 :std:mapmstrs;添加 :mstrs.push (“sdfsdf”);删除 :qstrs.erase(std:find(qstrs.begin(),qstrs.end(),“sdfsd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论