1 / 27

C++

C++. C++ 标签. 命名空间. 对于一个大型的 C 语言软件项目,给函数和全局变量起名不是一个容易的事情,因为必须考虑有没有可能与其它程序员写的代码冲突,多数的做法是对每个模块的一组函数名加个特定 前缀。比如著名的 PJSIP 库, 它选择了在 每个函数和类型 的前面加上前缀 “ pj _” ,使得标识符都比较长,而且看起来有点儿冗余。. 命名空间. 所以 C++ 引入了 namespace 的概念,把一些标识符以命名空间树结构的方式组织起来,使代码看起来更优雅 。

Download Presentation

C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++

  2. C++标签

  3. 命名空间 • 对于一个大型的C语言软件项目,给函数和全局变量起名不是一个容易的事情,因为必须考虑有没有可能与其它程序员写的代码冲突,多数的做法是对每个模块的一组函数名加个特定前缀。比如著名的PJSIP库,它选择了在每个函数和类型的前面加上前缀“pj_”,使得标识符都比较长,而且看起来有点儿冗余。

  4. 命名空间 • 所以C++引入了namespace的概念,把一些标识符以命名空间树结构的方式组织起来,使代码看起来更优雅。 • namespace parser { inline double get_double(char **str_ptr); inline intget_int(char **str_ptr);} • namespace sight { inline AngleDegViewAngle(ViewWidthview_width);}

  5. 命名空间 • 方式一,只在必要的时候通过域运算符::引用指定命名空间内的标识符 • parser::get_double(……); • std::cout<<…… • 方式二,把parser命名空间中的全部标识符都引入到当前编译单元中 • using namespace parser;get_double(……);

  6. 命名空间 • 当声明命名空间时的名称为空时,则该命名空间为匿名命名空间(unnamed namespace)。匿名的空间是C++用于定义作用域为本编译单元的函数或变量的一种新的方式。由于匿名命名空间没有命名空间的名字,所以也无法在其它的编译单元内通过extern声明该变量或函数,于是该变量自然也只在本编译单元内可见。

  7. 命名空间 • namespace {boolret = BehaviorExecutable::AutoRegister<BehaviorDribbleExecuter>();}

  8. string • char * -> string • #include <string> • string s;

  9. string • string s; //生成一个空字符串s • string s(str) //拷贝构造函数 生成str的复制品 • string s(str, idx) //将字符串str内“始于位置idx”的部分当作字符串的初值 • string s(str, idx, len) //将字符串str内“始于idx且长度顶多len”的部分作为字符串的初值 • string s(“asdf”) //将C风格字符串作为s的初值 • string s(c_str, len) //将C风格字符串c_str的前len个字符作为字符串s的初值。 • string s(n, c) //生成一个字符串,包含n个c字符 • string s(begin, end) //以区间[begin, end)内的字符作为字符串s的初值

  10. string • C++提供的由string得到对应的C风格字符串的方法有三种: • s.data(); //以字符数组的形式返回字符串内容,末尾没有\0。 • s.c_str(); //返回一个以\0结尾的字符数组,也就是最标准的C风格字符串。 • s.copy(c_str, n, pos); //把字符串的内容复制或写入既有的字符数组内。

  11. string • 访问string包含的字符——下标操作符[] • s[0] //第一个字符 • string s(“asdf”);s[5] //返回\0 • s.assign(str, 1, 5); //如果str是”WrightEagle”就是把”right”赋给字符串s • s += str; //追加个字符串s += ”WrightEagle”; //追加个C风格字符串s += ’a’; //追加个字符

  12. string • 字符串长度 • s.length() • 取子串 • s.substr(6); //从索引6开始到结尾的子串 • s.substr(1, 5); //从索引1开始5个字符 • insert、erase、replace • compare、find、rfind • <、>、<=、>=

  13. 流输入输出 • iostream scanf/printf • cin>>XXX; cout<<XXX; • fstream fscanf/fprintf • ifstream fin(“input.txt”); • ofstreamfout(“output.txt”); • fin>>XXX; fout<<XXX; • stringstream sscanf/sprintf • stringstreamcmd_str; • cmd_str << “(dash ” << mCommandInfo.mPower << “ ” << mCommandInfo.mAngle << “)”;

  14. 模板与泛型编程

  15. 模板 • 实践中需要各种各样的min函数 • int min(int a, int b) { return a>b ? b : a; } • double min(double a, double b) { return a>b ? b : a; } • 如果还需要其他类型的min怎么办? • char short long long-long float long-double • ActiveBehaviorAngleDeg

  16. 模板 • 类型抽象——_Tp类型 • template<typename_Tp>inline const_Tp&Min(const_Tp& x, const_Tp& y){ return std::min(x, y);} • Min(2, 3); • Min(3.0, 4.0); • Min(act_bhv1, act_bhv2);

  17. 模板 • Min(1, 2.0); //推断出错 • Min(player1, player2); //编译出错

  18. 模板 • template<typename _Tp, std::size_t_Nm, bool_Zero = false>class Array{ _Tp _M_instance[_Nm ? _Nm : 1];public: Array() { if (_Zero) { bzero(); } } _Tp& operator[](conststd::size_t & i) { return _M_instance[i];}};

  19. 模板 • Array<int, 11> numbers; • Array<PlayerState &, 11> teammates; • template<typename _Tp, std::size_t_Nm, bool_Zero = false>

  20. 标准模板库 • C语言有一个小巧精干的标准库; • C++在引入泛型编程的思想后,标准库得到了广泛的、革命性的变革——标准模板库。 • vector、list、deque、queue、stack、priority_queue、set/map纷纷进入STL; • STL中的函数不再限定参数的类型,而只做出基本要求: • min、max、sort要求此种类型定义过”<“; • binary_search要求传递进来的序列可以随机访问; • ……

  21. vector • #include <vector> • std::vector<PlayerState> players; • players[0]; //取指定位置的元素,[0]是第一个元素 • players.size(); //players的长度 • players.push_back(player1); //将一个元素插入到vector的最后面 • insert()、clear()、erase()

  22. list • #include <list> • std::list<ActiveBehavior> mActiveBehaviorList; • ActiveBehaviordribble;mActiveBehaviorList.push_back(dribble); • mActiveBehaviorList.sort(std::greater<ActiveBehavior>()); • mActiveBehaviorList.front(); • mActiveBehaviorList.empty();

  23. 迭代器 • 最简单的迭代器相当于指向容器中元素的指针; • for (vector<PlayerState>::iterator i = players.begin();i < players.end(); ++i){i->GetPos(); (*i). GetNeckDir();} • players.end() 表示“超出末端的位置”。 • i相当于players里元素的指针。 • vector的迭代器可以随机访问 • --i; • i+= 2; • i-= 6; • 与iterator相仿的是reverse_iterator,对应有rbegin()、rend()。

  24. 迭代器 • 迭代器的失效——如果一个迭代器指向的元素已经被删除,那么该迭代器失效,访问该迭代器后果不可预料。 • 迭代器的分类: • 随机访问迭代器 • 前向迭代器 • 双向迭代器 • 输入迭代器 • 输出迭代器 • 正向迭代器 • 反向迭代器 • 常量迭代器 • 流迭代器

  25. sort • #include<algorithm> • vector<int> a;sort(a.begin(), a.end()); • vector<person> c;sort(c.rbegin(), c.rend()); • int b[100];sort(b, b+100); • list<double> d;sort(d.begin(), d.end()); //Xd.sort(); //O

  26. 补充

  27. Q&A http://cplusplus.com/reference/ wrighteagle-2d-training+subscribe@googlegroups.com

More Related