270 likes | 396 Views
C++. C++ 标签. 命名空间. 对于一个大型的 C 语言软件项目,给函数和全局变量起名不是一个容易的事情,因为必须考虑有没有可能与其它程序员写的代码冲突,多数的做法是对每个模块的一组函数名加个特定 前缀。比如著名的 PJSIP 库, 它选择了在 每个函数和类型 的前面加上前缀 “ pj _” ,使得标识符都比较长,而且看起来有点儿冗余。. 命名空间. 所以 C++ 引入了 namespace 的概念,把一些标识符以命名空间树结构的方式组织起来,使代码看起来更优雅 。
E N D
命名空间 • 对于一个大型的C语言软件项目,给函数和全局变量起名不是一个容易的事情,因为必须考虑有没有可能与其它程序员写的代码冲突,多数的做法是对每个模块的一组函数名加个特定前缀。比如著名的PJSIP库,它选择了在每个函数和类型的前面加上前缀“pj_”,使得标识符都比较长,而且看起来有点儿冗余。
命名空间 • 所以C++引入了namespace的概念,把一些标识符以命名空间树结构的方式组织起来,使代码看起来更优雅。 • namespace parser { inline double get_double(char **str_ptr); inline intget_int(char **str_ptr);} • namespace sight { inline AngleDegViewAngle(ViewWidthview_width);}
命名空间 • 方式一,只在必要的时候通过域运算符::引用指定命名空间内的标识符 • parser::get_double(……); • std::cout<<…… • 方式二,把parser命名空间中的全部标识符都引入到当前编译单元中 • using namespace parser;get_double(……);
命名空间 • 当声明命名空间时的名称为空时,则该命名空间为匿名命名空间(unnamed namespace)。匿名的空间是C++用于定义作用域为本编译单元的函数或变量的一种新的方式。由于匿名命名空间没有命名空间的名字,所以也无法在其它的编译单元内通过extern声明该变量或函数,于是该变量自然也只在本编译单元内可见。
命名空间 • namespace {boolret = BehaviorExecutable::AutoRegister<BehaviorDribbleExecuter>();}
string • char * -> string • #include <string> • string s;
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的初值
string • C++提供的由string得到对应的C风格字符串的方法有三种: • s.data(); //以字符数组的形式返回字符串内容,末尾没有\0。 • s.c_str(); //返回一个以\0结尾的字符数组,也就是最标准的C风格字符串。 • s.copy(c_str, n, pos); //把字符串的内容复制或写入既有的字符数组内。
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’; //追加个字符
string • 字符串长度 • s.length() • 取子串 • s.substr(6); //从索引6开始到结尾的子串 • s.substr(1, 5); //从索引1开始5个字符 • insert、erase、replace • compare、find、rfind • <、>、<=、>=
流输入输出 • 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 << “)”;
模板 • 实践中需要各种各样的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
模板 • 类型抽象——_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);
模板 • Min(1, 2.0); //推断出错 • Min(player1, player2); //编译出错
模板 • 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];}};
模板 • Array<int, 11> numbers; • Array<PlayerState &, 11> teammates; • template<typename _Tp, std::size_t_Nm, bool_Zero = false>
标准模板库 • C语言有一个小巧精干的标准库; • C++在引入泛型编程的思想后,标准库得到了广泛的、革命性的变革——标准模板库。 • vector、list、deque、queue、stack、priority_queue、set/map纷纷进入STL; • STL中的函数不再限定参数的类型,而只做出基本要求: • min、max、sort要求此种类型定义过”<“; • binary_search要求传递进来的序列可以随机访问; • ……
vector • #include <vector> • std::vector<PlayerState> players; • players[0]; //取指定位置的元素,[0]是第一个元素 • players.size(); //players的长度 • players.push_back(player1); //将一个元素插入到vector的最后面 • insert()、clear()、erase()
list • #include <list> • std::list<ActiveBehavior> mActiveBehaviorList; • ActiveBehaviordribble;mActiveBehaviorList.push_back(dribble); • mActiveBehaviorList.sort(std::greater<ActiveBehavior>()); • mActiveBehaviorList.front(); • mActiveBehaviorList.empty();
迭代器 • 最简单的迭代器相当于指向容器中元素的指针; • 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()。
迭代器 • 迭代器的失效——如果一个迭代器指向的元素已经被删除,那么该迭代器失效,访问该迭代器后果不可预料。 • 迭代器的分类: • 随机访问迭代器 • 前向迭代器 • 双向迭代器 • 输入迭代器 • 输出迭代器 • 正向迭代器 • 反向迭代器 • 常量迭代器 • 流迭代器
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
Q&A http://cplusplus.com/reference/ wrighteagle-2d-training+subscribe@googlegroups.com