C++知识点补缺

最近用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()

      find(key):返回键为key的映射,时间复杂度为O(logN)

      erase()

      删除单个元素:

      mp.erase(it):it为需要删除的元素的迭代器。时间复杂度为O(1)

      mp.erase(key):key为删除元素的键,时间复杂度为O(logN)

      删除区间内的元素,左闭右开[start,end)

      size()
      clear()

      用来清空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

posted @ 2021-11-21 15:19  风吹过半夏  阅读(36)  评论(0编辑  收藏  举报