最近用C++写设计模式,遇到了很多问题,在此总结。
1.C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用
首先要明白类的定义与声明的区别
类的声明:
class A;
类的定义:
class A { string a; }
当用实例化一个类的对象时,编译器会根据类的定义来分配相应的存储空间。也就是说,在创建对象前,一定要有完整的类定义,这样编译器才能正确的计算所需空间。
当遇到如下情况时
class A { A a; }
上述代码中,由于Screen还没有定义结束,在内部定义一个Screen类型的对象时,编译器无法知道应该为sc分配多少空间,因此会报注释中的错误。
在类定义时,已指向自身类型的指针或引用作为数据成员则没有问题。按照前面的介绍就很好理解了,由于指针和引用所占存储空间大小与类型无关,所以编译器可以计算分配空间,所以正确。
2.C++标准模板库stack,queue
基本的函数
stack:
(1) push()
push(x)将x入栈,时间复杂度为0(1),
(2) top()
top()获得栈顶元素,时间复杂度为0(1).
(3) pop()
pop()用以弹出栈顶元素,时间复杂度为0(1)。
(4)empty()
empty()可以检测stack 内是否为空,返回true为空,返回false 为非空,时间复杂度为0(1)。
(5)size()
size()返回stack内元素的个数,时间复杂度为0(1)。
queue:
(1)push(x)
将x进行入队,时间复杂度为0(1)
(2)front()和back()
可以分别获得队首元素和队尾元素,时间复杂度为0(1)
(3)pop()
令队首元素出队,时间复杂度为0(1)。
(4)empty()
检测queue是否为空,返回true则空,返回false则非空。时间复杂度为0(1)。
(5)size()
返回queue内元素的个数,时间复杂度为0(1)。
3.list的使用
(1)list中的构造函数:
list() 声明一个空列表;
list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的
list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的
list(n,val) 声明一个和上面一样的列表
list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素
(2)begin()和end():通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的 end() 函数来得到list末端下一位置,相当于:int a[n]中的第n+1个 位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用。
(3)push_back() 和push_front():使用list的成员函数push_back和push_front插入一个元素到list中。其中push_back()从list的末端插入,而 push_front()实现的从list的头部插入。
(4)empty():利用empty() 判断list是否为空。clear(): 清空list中的所有元素。
(5)list遍历:
#include<list> //define list list<int> order1; list<int>::iterator iter1; for (iter1 = order1.begin(); iter1 != order1.end(); iter1++) { cout << "order1 = "<<*iter1 << endl; }
4.map的使用
(1)map的定义: map<string,int> mp;
(2)map容器元素的访问:map的两种访问方式:下标访问、迭代器访问
(3)map常用函数
find(key):返回键为key的映射,时间复杂度为O(logN)
删除单个元素:
mp.erase(it):it为需要删除的元素的迭代器。时间复杂度为O(1)
mp.erase(key):key为删除元素的键,时间复杂度为O(logN)
删除区间内的元素,左闭右开[start,end)
用来清空map,复杂度为O(N)
参考博客:
https://blog.csdn.net/playboy_lei/article/details/52040050
https://www.cnblogs.com/drq1/p/9699482.html
https://blog.csdn.net/yas12345678/article/details/52601578/
https://blog.csdn.net/weixin_43464653/article/details/115284100?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-2-115284100.pc_agg_new_rank&utm_term=c%2B%2Blist+%E9%81%8D%E5%8E%86%E6%89%80%E6%9C%89%E5%85%83%E7%B4%A0&spm=1000.2123.3001.4430
https://www.cnblogs.com/drq1/p/9699482.html