学习资料:《C++ STL标准程序库开发指南》
2019/1/17
- 模板可以认为是针对一个或多个尚未明确的类型而编写一套函数或类型。
- 标识符,自己定义的具有特定含义的词。
- 命名空间(namespace)指标识符的可见或有效范围,防止命名重复
- 乘方运算
#include<cmath> a=pow(X,Y) //a等于X的Y次方,使用C语言的常规函数pow(double x,double,y),是幂函数
2019/1/18
- 开方运算
#include<cmath> sqrtC=sqrt(x)
2019/1/19
- typedef 和#define都可以为类型声明一个新的名字,typedef是语言编译的一部分,不需要为其分配内存。
typedef int INT_32
#define INT_32
- #include<list> 使用了list模板中的迭代器
#include<list> list<结构体名称> 对象名 //声明一个list容器的对象,容器中的元素是PERSON类型的对象 list<结构体名称>::iterator Iter //声明容器迭代器类型变量Iter for(Iter=C1.begin();Iter!=C1.end();Iter++){ //遍历输出容器中的各元素 temp.clear() }
- struct和class的本质区别是访问控制方式
- struct作为数据结构的实现体,他的默认访问方式是public,而class作为对象的是实现体,它的默认成员变量访问控制方式是private。
- “class”还用于定义模板参数,像“typename“。但关键字”struct“不用于定义模板参数
2019/1/22
- 指针变量增加1或减少1之后,增加或减少的变量等于指针指向的类型的字节数
- C++将数组名解释为数组第1个元素的地址
- 动态创建指针需要使用new操作符,即数组的长度是未知的。用delete[]指令释放其所占用的内容,否则会造成内存泄露。
使用指针的目的是希望能够直接映射到程序运行所在的机器上的地址机制。cin>>size; int* pi=new int[size]; delete [] pi;
- 将实际参数传递给形参表可以有两种表现形式:赋值调用和引用调用。
- 函数的递归调用形式实现时关键是将“递归调用条件”放在递归调用前面。
- static 希望函数中局部变量的值在函数调用结束后不消失而保留时,用static声明局部变量。
- 关于文件的处理功能,常见的:(包含头文件#include<fstream>)
读取文件 ifstream wifstream(字读取操作) 将数据写入文件 ofstream wofstream 用于读/写文件 fstream wfstream 进行实际的字符读写 filebuf wfilebuf
-
#include<iostream> #include<fstream> using namespace std; void main() { ifstream f1; //设置文件缓冲区 ofstream f2; char filename1[256]; char filename2[256]; char content[256]; cout<<"请输入文件名(源):"; cin>>filename1; cout<<"请输入文件名(目的):"; cin>>filename2; f1.open(filename1,ios::in);//打开源文件读取 f2.open(filename2,ios::out);//写入 while(!f1.eof()) { f1.getline(content,128);//读取文件中数据 f2<<content<<endl;//将数据写入目标文件 } f1.close(); f2.close(); }
-
使用临时文件,为临时文件制定一个命名方案,确保每个文件都被指定独一无二的文件名。tmpname()函数创建一个临时文件名,将它放在pszname指向的C风格字符串中。
#include<iostream> #include<cstdio> using namespace std; void main() { cout<<"This system can generate up to "<<TMP_MAX<<"temporary names of up to"<<L_tmpnam<<" characters.\n"; char pszName[L_tmpname]={'\0'}; cout<<"Here are ten names:\n"; for(int i=0;i<10;i++) { tmpname(pszName); cout<<pszName<<endl; } return; }
2019/1/23
- 类模板的定义:"A class template defines the layout and openation for an unbounded set of related types." 对于一些非紧密相关的数据类型,类模板定义了它们共同的设计(类的结构)和操作(子函数)等。
- 模板实例化一般指使用模板类和模板参数生成一个类声明的过程。(类模板实例化就是如果使用类模板生成类,在生成一个类对象)
- 成员模板:一个模板可以在另一个类或类模板中声明,这样的模板称为称为成员模板;成员模板的定义既可以在类(或类模板)定义内部,也可以在类(或类模板)定义外部
- 友元模板:友元机制允许一个类将对其非公有制成员的访问权授予指定的函数或类。一般友元声明以关键词friend开始。友元只能出现在类定义的内部。而友元的声明可以出现在类中的任何地方。
2019/1/24
- 函数模板定义了一个无限的相关函数的集合。当函数除了数据类型不一致外,其余的处理全部想相同。函数模板可以定义参数化的非成员函数
- typename告诉编译器其后的名称为一个类型,用来创建实例
- STL的代码从广义上来讲主要分为3类:algorithm(算法)、container(容器)、iterator(迭代器) 容器:用来管理某类对象的集合。 迭代器:用来在一个对象群集的元素上进行遍历动作。迭代器的主要用途是为容器提供一组很小的公共接口。 算法:用来处理群集内的元素。
- 容器类似数组的单元,可以存储若干个值。STL容器是同质的,即存储的值类型相同;算法是完成特定任务的处方,迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;仿函数是类似于函数的对象,可以是类对象或函数指针。
- vector是一个多功能的,能够操作多组数据结构和算法的模板类和函数库
- 字符串处理类string,智能指针auto_ptr。
- 字符串类:basic_string ,字符类型由函数模板决定。string库中npos可以定义字符串的最大长度;string库其它功能:删除字符串的部分或全部;用一个字符的部分或全部替换另一个字符串的部分或全部;插入、删除字符串中的数据;比较、提取、复制、交换等操作。