C++系统研发工程师知识储备(四)

面向对象与泛型编程

(一)容器

4、queue容器

基本概念
  • Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口
  • 队列容器允许从一端新增元素,从另一端移除元素
  • 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
  • 队列中进数据称为 — 入队 push
  • 队列中出数据称为 — 出队 pop
构造函数
        queue<T> que; //queue采用模板类实现,queue对象的默认构造形式
        queue(const queue &que); //拷贝构造函数
赋值操作
        queue& operator=(const queue &que); //重载等号操作符
数据存取
        push(elem); //往队尾添加元素
        pop(); //从队头移除第一个元素
        back(); //返回最后一个元素
        front(); //返回第一个元素
大小操作
        empty(); //判断堆栈是否为空
        size(); //返回栈的大小

5、string容器

基本概念
  • string和char* 区别:
    • char* 是一个指针;
    • string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。
  • 特点:string 类内部封装了很多成员方法,例如:查找find,拷贝copy,删除delete 替换replace,插入insert;string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
string构造函数
    string(); //创建一个空的字符串 例如: string str; string(const char* s); //使用字符串s初始化
    string(const string& str); //使用一个string对象初始化另一个string对象
    string(int n, char c); //使用n个字符c初始化
string赋值操作:给string字符串进行赋值
    string& operator=(const char* s); //char*类型字符串 赋值给当前的字符串
    string& operator=(const string &s); //把字符串s赋给当前的字符串
    string& operator=(char c); //字符赋值给当前的字符串
    string& assign(const char *s); //把字符串s赋给当前的字符串
    string& assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
    string& assign(const string &s); //把字符串s赋给当前字符串
    string& assign(int n, char c); //用n个字符c赋给当前字符串
string字符串拼接:实现在字符串末尾拼接字符串
    string& operator+=(const char* str); //重载+=操作符
    string& operator+=(const char c); //重载+=操作符
    string& operator+=(const string& str); //重载+=操作符
    string& append(const char *s); //把字符串s连接到当前字符串结尾
    string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾
    string& append(const string &s); //同operator+=(const string& str)
    string& append(const string &s, int pos, int n);//字符串s中从pos开始的n个字符连接到字符串结尾
string查找(查找指定字符串是否存在)和替换(在指定的位置替换字符串)
    int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
    int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
    int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
    int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
    int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找
    int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找
    int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置
    int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
    string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
    string& replace(int pos, int n,const char* s); //替换从pos开始的n个字符为字符串s
    总结:find查找是从左往后,rfind从右往左;find找到字符串后返回查找的第一个字符位置,找不到返回-1;replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串
string字符串比较
    比较方式:
        字符串比较是按字符的ASCII码进行对比:= 返回 0;> 返回 1;< 返回 -1

    函数原型:
        int compare(const string &s) const; //与字符串s比较
        int compare(const char *s) const; //与字符c比较
string字符存取
    char& operator[](int n); //通过[]方式取字符
    char& at(int n); //通过at方法获取字符
string插入和删除
   	对string字符串进行插入和删除字符操作,插入和删除的起始下标都是从0开始
    string& insert(int pos, const char* s); //插入字符
    string& insert(int pos, const string& str); //插入字符串
    string& insert(int pos, int n, char c); //在指定位置插入n个字符c
    string& erase(int pos, int n = npos); //删除从Pos开始的n个字符
string子串:从字符串中获取想要的子串
    string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串

6、stack容器

基本概念

  • stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口在这里插入图片描述
  • 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
  • 栈中进入数据称为 — 入栈 push
  • 栈中弹出数据称为 — 出栈 pop
构造函数
        stack<T> stk; //stack采用模板类实现, stack对象的默认构造形式
        stack(const stack &stk); //拷贝构造函数
赋值操作
        stack& operator=(const stack &stk); //重载等号操作符
数据存取
        push(elem); //向栈顶添加元素
        pop(); //从栈顶移除第一个元素
        top(); //返回栈顶元素
大小操作
        empty(); //判断堆栈是否为空
        size(); //返回栈的大小

7、set/multiset容器

基本概念
  • 所有元素都会在插入时自动被排序;set/multiset属于关联式容器,底层结构是用二叉树实现。
  • set和multiset区别:set不允许容器中有重复的元素;multiset允许容器中有重复的元素
  • set容器默认排序规则为从小到大,利用仿函数,可以改变排序规则;对于自定义数据类型,set必须指定排序规则才可以插入数据
常用接口
    set<T> st; //默认构造函数:
    set(const set &st); //拷贝构造函数
    set& operator=(const set &st); //重载等号操作符
    size(); //返回容器中元素的数目
    empty(); //判断容器是否为空
    swap(st); //交换两个集合容器
    insert(elem); //在容器中插入元素。
    clear(); //清除所有元素
    erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
    erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
    erase(elem); //删除容器中值为elem的元素。
    find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
    count(key); //统计key的元素个数
    pair<type, type> p ( value1, value2 );
    pair<type, type> p = make_pair( value1, value2 );//成对出现的数据,利用对组可以返回两个数据

8、map/multimap容器

基本概念
  • 简介:map中所有元素都是pair。pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。所有元素都会根据元素的键值自动排序
  • 本质:map/multimap属于关联式容器,底层结构是用二叉树实现。(关联式容器内部采用的就是一种非常高效的平衡检索二叉树:红黑树)
  • 优点:可以根据key值快速找到value值
  • map和multimap区别:map不允许容器中有重复key值元素,multimap允许容器中有重复key值元素
常用接口
    map<T1, T2> mp; //map默认构造函数: map(const map &mp); //拷贝构造函数 map& operator=(const map &mp); //重载等号操作符
    size(); //返回容器中元素的数目empty(); //判断容器是否为空 swap(st); //交换两个集合容器 insert(elem); //在容器中插入元素。
    clear(); //清除所有元素erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
    erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(key); //删除容器中值为key的元素。
    find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(); count(key); //统计key的元素个数map容器默认排序规则为 按照key值进行 从小到大排序,利用仿函数,可以改变排序规则

9、 map、unordered_map

map
  • map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树)
    • 红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。
    • 对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。
    • map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。
  • 优点:有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作;红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高;
  • 缺点: 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间
  • 适用处:对于那些有顺序要求的问题,用map会更高效一些
unordered_map:
  • unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。 因此,其元素的排列顺序是无序的
  • 优点: 因为内部实现了哈希表,因此其查找速度非常的快
  • 缺点: 哈希表的建立比较耗费时间
  • 适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值