C++——STL学习笔记

学习资料:《C++ STL标准程序库开发指南》

2019/1/17

  • 模板可以认为是针对一个或多个尚未明确类型而编写一套函数或类型
  • 标识符,自己定义的具有特定含义的词。
  • 命名空间(namespace)指标识符的可见或有效范围,防止命名重复
  • 乘方运算
    #include
    a=pow(X,Y)    //a等于X的Y次方,使用C语言的常规函数pow(double x,double,y),是幂函数

2019/1/18 

  • 开方运算

     

    #include
    sqrtC=sqrt(x)

2019/1/19 

  • typedef 和#define都可以为类型声明一个新的名字,typedef是语言编译的一部分,不需要为其分配内存。

typedef int INT_32  

#define INT_32

  • #include    使用了list模板中的迭代器

     

    #include
    
    list<结构体名称> 对象名    //声明一个list容器的对象,容器中的元素是PERSON类型的对象
    list<结构体名称>::iterator Iter    //声明容器迭代器类型变量Iter
    for(Iter=C1.begin();Iter!=C1.end();Iter++){     //遍历输出容器中的各元素
        temp.clear()
    }
  • struct和class的本质区别是访问控制方式
  1. struct作为数据结构的实现体,他的默认访问方式是public,而class作为对象的是实现体,它的默认成员变量访问控制方式是private。
  2. “class”还用于定义模板参数,像“typename“。但关键字”struct“不用于定义模板参数

2019/1/22

  • 指针变量增加1或减少1之后,增加或减少的变量等于指针指向的类型的字节数
  • C++将数组名解释为数组第1个元素的地址
  • 动态创建指针需要使用new操作符,即数组的长度是未知的。用delete[]指令释放其所占用的内容,否则会造成内存泄露。
    cin>>size;
    int* pi=new int[size];
    
    delete [] pi;
    使用指针的目的是希望能够直接映射到程序运行所在的机器上的地址机制。
  • 将实际参数传递给形参表可以有两种表现形式:赋值调用和引用调用。
  • 函数的递归调用形式实现时关键是将“递归调用条件”放在递归调用前面。
  • static 希望函数中局部变量的值在函数调用结束后不消失而保留时,用static声明局部变量。
  • 关于文件的处理功能,常见的:(包含头文件#include)
  • #include
    #include
    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<
  • 使用临时文件,为临时文件制定一个命名方案,确保每个文件都被指定独一无二的文件名。tmpname()函数创建一个临时文件名,将它放在pszname指向的C风格字符串中。

    #include
    #include
    using namespace std;
    void main()
    {
    	cout<<"This system can generate up to "<

     

 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库其它功能:删除字符串的部分或全部;用一个字符的部分或全部替换另一个字符串的部分或全部;插入、删除字符串中的数据;比较、提取、复制、交换等操作。

2019/1/26

  • 常见的string类构造函数

     

    string strs            //生成空字符串
    string s(str)            //生成字符串str的复制品
    string s(str,stridx)        //将字符串str始于stridx的部分,作为构造函数的初值
    string s(cstr)                //以C_string类型cstr作为字符串s的初值
    string s(cstr,char_len)        //以c_string类型的cstr的前char_len个字符串作为字符串s的初值
    string s(num,c)                //生成一个字符串,包含num个c字符
    string s(strs,beg,end)         //以区间(beg,end)内的字符作为字符串s的初值
  • (1)size()和length()——————返回string对象的字符个数(2)max_size()——返回string类对象最多包含的字符数(3)capacity()重新分配内存之前,string对象包含的最大字符数
  • resize(个数)起到重新分配内存的目的。
  • 利用下标操作符 [ ] 和成员函数 at() 访问字符串中单一字符
  • 字符串的比较#include里的compare()函数,比如A和B相比较int returnnum=A.compare(B); int returnnum=A.compare(1,5,B);int returnnum2=A.compare(0,4,B,1,3);
  • assign()字符串中赋值函数,swap()字符串交换函数,iterator——string::iterator itB定义一个迭代器

2019/1/28

  • string类,和使用迭代器相关的成员函数,主要包括:begin(),end(),rbegin(),rend()构造器,append(),assign(),insert(),erase(),replace()等
  • 使用STL涉及容器,容器中存储大量的数值,需要分配空间。配置器的作用是为容器开辟内存
  • basic_string类模板中包含一个配置器类型的成员:allocator_type。对于string对象,其可以作为配置器类的对象使用:对于string类而言,等价于allocator,即分配数据类型为char的内存,便于string 类的对象存储char类型字符。string类还提供1个和配置器相关的函数:get_allocator()。
  • 容器时管理序列的类,实现对序列中的元素的操作。STL提供了各种容器模板类:向量(vector),列表(list),双队列(deque),集合(set),多重集合(multiset),映射(map),多重映射(multimap)
  • 向量可以认为是包含1个或N个更多元素的数组;列表是由节点组成的双向链表,每个节点包含1个元素;双队列是包含N个连续的指向不同元素的指针组成的数组;集合是由节点组成的,每个节点包含1个元素,节点之间以某种谓词排序;多重集合是允许存在两个次序像相等的元素集合;映射是由{键,值}对组成的集合,同样以某种谓词排序;多重映射是允许键对包含相等次序的映射

2019/2/2

  • 使用指针作参数,交换两个数。当交换功能写成函数时,应写成指针参数的形式。函数在接收参数的过程中是单向一次性的值传递,也就是说,在调用swap(a,b)时只是把a和b的值传进去了,这样就相当于产生一个副本,对这个副本的操作不影响main函数中a、b的值。指针的方法:指针变量存储的是地址,使用指针变量作为参数时传过来的也是地址,只有在获取地址的情况下对元素进行操作,才是真正的修改变量。
  • 对引用变量的操作就是对原变量的操作。在函数参数类型后加&。
  • 结构体将若干个不同类型的变量或数组封装在一起,以存储自定义的数据结构,方便储存一些符合数据
  • 结构体里能定义除自己本身以外的任何数据类型,不过不能定义自己本身,但可以定义自身类型的指针变量。
  • 时间复杂度时算法运行基本运算的次数所处的等级。在时间复杂度中,高等级的幂次会覆盖低等级的幂次
  • 散列法是一种以空间换时间的高效方法
  • 在读取文件到达文件末尾导致无法读取现象,会产生读入失败。这个时候,scanf函数会返回-1而不是0,C语言中使用EOF来代表-1。所以当题目没有说明有多少数据需要读入时,可以利用scanf的返回值是否为EOF来判断输入是否结束。

     

    while(scanf("%d",&n)!=EOF){
        ...
    }
  •  

2019/2/14

  • vector中begin()函数的作用取vi的首元素地址,end()并不是取vi的尾元素地址,而是取尾元素的下一个地址。end()作为迭代器结束的标志,不存储任何元素
  • 在STL中,只有在vector和string中,才允许使用vi.begin()+3这周迭代器加上整数的方法
  • push_back(x)就是在vector后面添加一个元素x,pop_back()删除最后一个元素,clear()清空vector中所有的元素;insert(it,x)向vector容器中任意位置插入一个元素
  • 迭代器取地址,*iterator ,相同地址,在地址自增的时候,指针+1;
  • STL中,erase(一个变量)删除指定位置的元素,erase(起始位置元素,末尾元素),删除一个范围的元素。
  • set是一个内部自动有序且不含重复元素的容器——#include

你可能感兴趣的:(C++,STL)