• C++STL


    一、概述

            内容

                    容器、算法、迭代器,共计13个头文件algorithm、deque、functional、iterator、vector、list、map、memory、numeric、queue、set、stack、utility

            优势                 

                                    ①不需要额外安装

                                    ②数据结构和算法分离(不需要考虑实现过程)

            特点

                    高可重用性、高性能、高移植性、跨平台

            用法

                            容器-->用于容纳数据

                            迭代器-->可以当成指针使用(实际上是一个封装了指针的类)

                            算法-->略

    二、容器

            1.string容器

                    特性:     string封装了char*,是一个char*型容器

                                    定义了很多方法:find、copy、delete、replace、insert

                                    不需要考虑内存释放和越界

                                    char*和string可以通过c_str()方法互转

    1. const char* cstr = str.c_str(); //string转cahr*
    2. string sstr(s); //char*转string(其中s为char*变量)

                    成员函数操作

    1. //构造
    2. string s1; //无参构造
    3. string s2(10,'a');
    4. string s3("abcdef");
    5. string s4(s3); //拷贝构造
    6. //赋值
    7. s1 = "abcde";
    8. s1 = s2;
    9. s1.assign("wdnmd");
    10. //成员函数
    11. s1.at(i); //访问指定位置字符
    12. //与s1[i]最大的不同是at函数一旦越界会抛出out_of_range异常
    13. s1+=s2; //拼接
    14. s1.append(s2,pos,n); //将s2从pos开始的n个字符连接到s1,pos和n即可缺省
    15. s1.find(s2, pos); //从pos开始查找s2,pos可缺省
    16. s1.rfind(s2,pos); //从pos开始倒序查找pos
    17. s1.replace(pos,n,s2) //将s1从pos开始的n个字符替换成s
    18. s1.compare(s2); //将s1和s2进行比较
    19. s1.substr(pos,n); //从s1中pos开始的位置提取n个字符组成子串
    20. s1.insert(pos,s2); //从pos开始插入s2
    21. s1.insert(pos,10,'c'); //从pos开始插入10个c
    22. s1.erase(pos,n); //删除pos开始的n个字符

            2.vector容器

                    单口容器

                    其提供了迭代器v.begin() / v.rend()--栈底v.end() / v.rbegin()--栈顶

                    动态增长的原理:若出现内存不足,vetor会重新申请更大的内存,将原有的内容移入(包含拷贝到新空间和释放旧空间)新空间中。

    1. //构造 & 赋值
    2. vector<int> v1; //使用模板类构造(默认构造)
    3. vector<int> v2(arr, arr+sizeof(arr)/sizeof(int)); //将arr[]中的元素拷贝给自身
    4. vector<int> v3(v2.begin(),v2.end()); //将v2拷贝给v3
    5. vector<int> v4(v3); //拷贝构造
    6. vector<int> v5(10,'1'); //构造10个1
    7. vector<int> v6 = v5; //通过=赋值
    8. v6.assign(v1.begin().v1.end()); //通过assign成员赋值
    9. //循环展示
    10. for(vector<int>::iterator it = v.begin(); it!=v.end(); it++)
    11. cout<<*it<<endl;
    12. //成员操作
    13. v1.swap(v2); //交换v1和v2
    14. v1.size(); //获取元素个数
    15. v1.capacity(); //获取容量
    16. v1.empty(); //判断是否为空
    17. v1.resize(n); //将v1的大小重新调整为4(多出的部分会被强制截断)
    18. v1.reserve(10); //预留空间
    19. v1.at(n); //访问第n个元素
    20. v1[n]; //访问第n个元素,区别同string
    21. v1.front(); //返回第一个元素
    22. v1.back(); //返回最后一个元素
    23. v1.insert(pos,count,elem); //从pos位置开始插入n个elem
    24. //pos的类型为迭代器const_iterator
    25. v1.push_back(elem); //尾部插入elem
    26. v1.pop_back(); //删除最后元素
    27. v1.erase(start,end); //删除从start到end的元素,类型均为const_iterator
    28. v1.erase(pos); //删除pos位置的元素,类型为const_iterator
    29. v1.clear(); //清空

                    使用过swap()收缩空间

                            原因:vector会自动增长,但是删除元素/resize()时不会自动缩减

    vector<int> (v).swap(v);

            3.deque容器

                    双口容器,包含push_back()、pop_back()、push_front()、pop_front()四种基本操作(而vector仅push_back()pop_back)提供了迭代器v.begin() / v.rend()v.end() / v.rbegin()

                    特性:①双端插入和删除元素效率高

                               ②指定位置插入会导致元素移动、降低效率

                               ③可随机存取、效率高

    1. //初始化
    2. deque<int> d1; //默认构造
    3. deque<int> d2(10,5); //构造后向内填充10个5
    4. deque<int> d3(d2.begin(),d2.end()); //将d2赋值给d3
    5. deque<int> d4(d3); //拷贝构造
    6. //赋值
    7. d4=d3; //重载等号
    8. d4.assign(10,5); //赋值10个5
    9. d4.assign(d3.begin(),d3.end()); //拷贝d3
    10. //循环展示
    11. for(deque<int>::iterator it = d4.begin(); it!=d4.end(); it++)
    12. cout<< *it <<endl; //*it可以代替d4.at(it);或d4[it];
    13. //成员操作
    14. d1.swap(d2); //交换
    15. d1.size(); //获取元素个数
    16. d1.empty(); //判断是否为空
    17. d1.resize(10); //重定义大小(超出部分会被截断)
    18. d1.resize(100,elem); //重定义大小(后面的用elem填充)
    19. d1.push_front(elem); //头插elem
    20. d1.push_back(elem); //尾插elem
    21. d1.pop_back(); //删除队尾元素
    22. d1.pop_front(); //删除队首元素
    23. d1.front(); //获取头元素
    24. d1.back(); //获取尾元素
    25. d1.insert(pos,n,elem); //从pos开始,插入n个elem
    26. d1.insert(pos,beg,end); //在pos区间插入begin和end之间的数据
    27. d1.erase(pos); //单点删除
    28. d1.erase(begin,end); //删除区间[begin,end]

                    实践,使用sort进行排序

    1. #include<algorithm>
    2. sort(d1.begin(),d1.end()); //对d1进行排序

            4.stack容器

                    栈容器,先进后出。

                    特点:不能遍历(不提供迭代器),不支持随机存取,只能通过top从栈顶获取/删除元素

    1. //初始化
    2. stack<int> s1; //默认构造
    3. stack<int> s2(s1); //赋值构造
    4. //操作
    5. s1.push(elem); //压栈
    6. s2.pop(); //删除栈顶
    7. s1.top(); //获取栈顶元素
    8. s1.empty(); //是否为空
    9. s1.size(); //返回栈大小

            5.queue容器

                    队列容器,先进先出

                    特点:不能遍历(不提供迭代器),不支持随机存取

    1. //初始化
    2. queue<int> q1; //默认构造
    3. queue<int> q2(q1); //拷贝构造
    4. //成员函数操作
    5. q1.push(elem); //入队
    6. q1.pop(); //删除队首元素
    7. q1.size(); //获取元素个数
    8. q.front(); //获取队头

            6.list容器

                    链表容器

                    特点:     ①非连续,添加删除元素不需要移动其他元素,效率高

                                    ②链表仅在需要的时候才分配内存

                                    ③链表需要额外的空间保存结点关系(前驱、后继关系)

    1. //初始化
    2. list<int> l1; //默认构造
    3. list<int> l2(n,elem); //构造n个elem给list
    4. list<int> l3(l2); //拷贝构造
    5. list<int> l4(l1.begin(),l2.end()); //将区间内值复制给l4
    6. //成员操作
    7. l1.push_back(); //尾插
    8. l1.pop_back(); //尾删
    9. l1.push_front(elem); //头插
    10. l1.pop_front(); //头删除
    11. l1.insert(pos,elem); //pos位置插入elem
    12. l1.insert(pos,n,elem); /pos位置插入n个elem
    13. l1.clear(); //清空
    14. l1.erase(begin,end); //删除区间[begin,end]
    15. l1.erase(pos); //删除pos位置
    16. l1.remove(elem); //删除所有elem成员
    17. l1.size(); //获取元素个数
    18. l1.empty(); //判断是否为空
    19. l1.resize(n); //将长度重定义为n
    20. l1.swap(l2); //交换
    21. l1.reverse(); //反转
    22. l1.sort(); //排序

            7.set/multiset容器

                    特点:        所有元素会根据值自动进行排序,set基于红黑树查找效率高

                                       set不允许重复元素,multiset允许重复元素

                                       不能利用迭代器更改set集合的值

    1. //构造
    2. set<int> st1; //默认构造
    3. multiset<int> st2; //默认构造2
    4. set<int> st3(st2); //拷贝构造
    5. st2=st1; //赋值
    6. st1.insert(7); //插值
    7. st1.swap(st2); //交换
    8. st1.size(); //获取元素个数
    9. st1.empty(); //判断是否为空
    10. st1.clear(); //清空
    11. st1.erase(pos); //定点删除
    12. st1.erase(begin,end); //区间清除
    13. st1.find(key); //查找
    14. st1.lower_bound(keyelem); //返回第一个key>=keyelem的迭代器
    15. st1.upper_bound(keyelem); //返回第一个key>keyelem的迭代器
    16. st1.equal(keyelem); //返回相等的上下限迭代器
    17. //pair<set<int>::iterator,set<int>::iterator> 使用s.first;和s.second进行识别

                    对组pair

                            一个对组中的数据类型可以不同,使用两个共有函数first和second进行访问

    1. pair<string,int> p1(string("Alice"),18); //创建对组
    2. cout<<p1.first<<p1.second; //输出
    3. pair<string,int> p2 = p1; //赋值

            8.map/multimap容器

                    与set区别,map具有键值和实值,根据键值进行排序;以红黑数为底层实现机制。

                    map不允许key值重复,multimap则允许

    1. //构造
    2. map<int,string> m1; //默认构造
    3. map<int,string> m2(m1); //拷贝构造
    4. m1=m2; //赋值
    5. m1.swap(m2); //交换
    6. m1.size();
    7. m1.empty();
    8. m1.insert(pair<int,string>(1,string("Alice"))); //插入
    9. m1.insert(make_pair(1,string("Alice")));
    10. m1.insert(map<int,string>::value_type(1,string("Alice")));
    11. m1[2] = "Tom"; //直插

  • 相关阅读:
    【网络安全 --- Burp Suite抓包工具】学网安必不可少的Burp Suite工具的安装及配置
    2311rust,到66版本更新
    HCIP第十三天
    论文阅读:Explainability for Large Language Models: A Survey
    使用opencv及FFmpeg编辑视频
    探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器?
    2022年,下半年互联网最靠谱的搞钱方法?
    flask获取post请求参数
    Linux 笔记 进程监测 进程管理
    计算ip是否在网络段(子网掩码)
  • 原文地址:https://blog.csdn.net/weixin_37878740/article/details/125360268