C++STL
Charlesffff
守得云开见月明,静待花开终有期
展开
-
STL:常用算数生成算法和常用集合算法(accumulate、fill、set_intersection、set_union、set_difference)
常用算数生成算法头文件:#include <numeric>一.accumulate计算容器元素累计总和。#include <iostream>#include <vector>#include <numeric>using namespace std;void test01() { vector<int> v; for (int i = 0; i < 3; i++) { v.push_back(i); }原创 2022-02-14 09:35:07 · 436 阅读 · 0 评论 -
STL:常用的拷贝替换算法(copy、swap)
一.copy#include <iostream>#include <vector>#include <algorithm>#include <functional>using namespace std;struct MyPrint{ void operator()(int v) { cout << v << " "; }};void test01() { vector<int> v1, v2原创 2022-02-11 10:50:22 · 453 阅读 · 0 评论 -
STL:常用排序算法(merge、sort、random_shuffle、reverse)
原创 2022-02-11 10:03:18 · 341 阅读 · 0 评论 -
STL:常用的遍历(for_each、transform)
一.for_each#include <iostream>#include <vector>#include <algorithm>#include <functional>using namespace std;struct MyPrint{ void operator()(int v) { cout << v << " "; }};void test01() { vector<int> v;原创 2022-02-10 16:49:02 · 264 阅读 · 0 评论 -
STL:常用查找函数(find、binary_search、adjacent_find、find_if、count、count_if)
一.find1.基本类型#include <iostream>#include <vector>#include <algorithm>#include <functional>using namespace std;struct MyPrint{ void operator()(int v) { cout << v << " "; }};void test01() { vector<int>原创 2022-02-10 15:14:42 · 704 阅读 · 0 评论 -
STL:bind1st、bind2nd绑定适配器、not、unary_function与binary_function区别、find_if()使用
函数对象适配器函数对象适配器是完成一些配接工作,这些配接包括绑定(bind)、否定(negate),以及对一般函数或成员函数的修饰,使其成为函数对象。bind1st:将参数绑定为函数对象的第一个参数bind2nd:将参数绑定为函数对象的第二个参数not1:对一元函数对象取反not2:对二元函数对象取反ptr_fun:将普通函数修饰成函数对象mem_fun:修饰成员函数mem_fun_ref:修饰成员函数1.绑定适配器:将一个二元函数对象转变为一元函数对象bind1st#include原创 2022-02-09 16:40:32 · 585 阅读 · 0 评论 -
STL:内建函数对象
一.谓词概念谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可以作为一个判断式。struct myfuncobj01 { bool operator(int v){}//接受一个参数,并且返回值为bool,即为一元谓词};bool compare01(int v){}//同样是一元谓词struct myfuncobj02 { bool operator(int v原创 2022-02-09 14:51:20 · 512 阅读 · 0 评论 -
STL:函数对象(仿函数)的概念
函数对象的概念重载函数调用操作符的类,其对象称为函数对象(function object),即他们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使类对象可以向函数那样调用。函数对象(仿函数)是一个类,不是一个函数。函数对象(仿函数)重载了“()”操作符使他可以像函数一样调用。假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们称这个类为”一元仿函数“;相反,如果重载的operator()要求获取两个参数,就称这个类为”原创 2022-01-22 16:22:34 · 573 阅读 · 0 评论 -
STL:容器共性机制、容器元素深拷贝和浅拷贝问题
11原创 2022-01-22 15:18:07 · 1766 阅读 · 0 评论 -
STL:map、multimap容器
一.特性map相对于set区别,map具有键值和实值,所有元素根据键值自动排序。pair的第一个元素被称为键值,第二个元素被称为实值。map也是红黑树为底层实现机制。map根据key排序。map中key不能重复,multimap中key可以重复。不能通过map迭代器修改map的键值,因为容器安装key排序,修改后规则发生变化。可以改变map的实值。如果想修改map的键值,应该先删除该结点,然后插入新结点。二.构造函数map<int, string> m1,m2;//默认构造函原创 2022-01-14 09:53:13 · 378 阅读 · 0 评论 -
STL:pair对组
一.特性对组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个公有函数first和second访问。类模板:template<class T1,class T2> struct pair二.创建//方法一:pair<string, int> p1("name", 20);//方法二:pair<string, int> p2 = make_pair("name", 20);...原创 2022-01-13 11:09:40 · 1773 阅读 · 0 评论 -
STL:set、multiset容器概念
一.特性关联容器。所以元素会根据元素的值自动进行排序。set是以RB-tree(红黑树平衡二叉树的一种)为底层机制,其查找效率非常好。set容器不允许重复元素,multiset允许重复元素。只有insert()方法。不能用迭代器改变元素值,因为set集合值是有顺序的,改变值,会改变规则。如果要改变元素值,必须先删除该结点,然后再插入。set唯一性和排序性测试:set<int> st;st.insert(7);st.insert(6);st.insert(4);st.i原创 2022-01-13 10:02:48 · 220 阅读 · 0 评论 -
STL:List链表
链表是由一系列的结点组成,结点包含两个域,一个数据域,一个指针域。链表内存是非连续的,添加和删除元素,时间复杂度都是常数项。在链表中插入元素,不需要移动元素。比数组添加删除效率高。链表只有在需要的时候才分配内存。一构造函数list<int> lt;list(beg, end);list(n, elem);list(const list & lt);二.插入、删除 list<int> lt; lt.push_back(elem);//在容器尾部加入原创 2022-01-12 13:58:13 · 693 阅读 · 0 评论 -
STL:queue队列、创建、赋值、存取、插入、删除、大小
一.特性先进先出(队尾进,队头出);没有迭代器,不能随机访问;二.构造函数queue<int> que;//类模板构造函数queue(const queue & que);//拷贝函数三.存取、插入、删除queue<int> que;//类模板构造函数que.push(elem);//向队尾添加元素que.pop();//从队头移除第一个元素que.back();//返回最后一个元素que.front();//返回第一个元素四.赋值操作que原创 2022-01-12 09:23:57 · 3874 阅读 · 0 评论 -
STL:stack容器
一.特性先进后出不能随机存储,只能通过top从栈顶获取和删除元素。头文件#include <stack>二.构造函数stack<int> st;//无参构造stack(const stack & st);//拷贝构造三.赋值操作stack& operator=(const stack & st);//重载等号操作符四.数据存取push(elem);//向栈顶添加元素pop();//从栈顶移除第一个元素top();//返回栈顶原创 2022-01-11 16:20:58 · 142 阅读 · 0 评论 -
STL:deque(双端数组)容器
一.特性deque是“double-end queue”的缩写,和vector一样,deque也支持随机存取。vector是单向开口的连续性空间,deque则是一种双向开口的连续性空间,所谓双向开口,意思是可以再头尾两端分别做元素的插入和删除操作,vector也可以在头尾进行插入和删除操作,但是头部插入和删除操作效率奇差,无法被接受。双端插入和删除元素效率较高。指定位置插入也会导致数据元素移动,降低效率。可随机存取,效率高。头文件#include <deque>二.构造函数.原创 2022-01-11 11:40:23 · 348 阅读 · 0 评论 -
STL:deque打分案例
#include <iostream>#include <deque>#include <vector>#include <algorithm>using namespace std;class Player { friend void Create_Player(vector<Player>& player);public: Player() {} Player(double score,string name):sc原创 2022-01-11 11:37:49 · 74 阅读 · 0 评论 -
STL:reserve预留空间提高程序效率
reserve()和resize()区别:reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。resize是改变容器大小,且在创建对象。饮茶,调用这个函数之后,就可以引用容器内的对象。为什么使用reserve()?vector<int> v;int num = 0;int* address = nullptr;for (int i = 0; i < 10000; i++) { v.push_back(i); i原创 2022-01-10 16:29:14 · 170 阅读 · 0 评论 -
STL:巧用swap收缩vector空间
为什么收缩空间?vector<int> v;for (int i = 0; i < 10000; i++) { v.push_back(i);}cout << "size=" << v.size() << endl;cout << "capacity=" << v.capacity() << endl;cout << "-----------resize()------------" <原创 2022-01-10 15:55:36 · 223 阅读 · 0 评论 -
STL:vector容器动态增长原理、定义、初始化、赋值、取数、插入、删除、大小、交换
vector容器:动态数组、可变数组、单口容器。vector实现动态增长原理:当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间数据,再把新元素插入新申请空间。一.vector构造函数vector<T> v;//采用模板实现类,默认构造函数v(v.begin(), v.end());//将v[begin(),end()]区间的元素拷贝给本身v(n, elem);//构造函数将n个elem拷贝给本身v(const v原创 2022-01-10 15:05:03 · 1455 阅读 · 0 评论 -
STL:string容器特性、定义、初始化、等号、取值、拼接、查找、替换、比较、字串、插入、删除
一.string的特性string和char*类型字符串的对比:char是一个指针,string是一个类,string封装了char,管理这个字符串,是一个char*型的容器。string封装了很多实用的成员方法,查找find,拷贝copy,删除delete,替换replace,插入insert不用考虑内存的释放和越界,string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。...原创 2022-01-10 10:49:36 · 567 阅读 · 0 评论 -
STL:基本理论基础容器-算法-迭代器概念
一.概念STL(标准模板库):从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator),容器和算法之间通过迭代器进行无缝连接,STL几乎所有代码都采用了模板类和模板函数,相比较传统的由函数和类组成的库来说提供了更好的代码重用机会。STL的一个重要特点是数据结构和算法分离。1.容器序列式容器:容器的元素的位置是由进入容器时间和地点来决定。(先进容器,就现在前面)关联式容器:按规定排序。(类似于按照人类按照大小个子排顺序)2.迭代器用于遍历容器元素的原创 2022-01-07 14:42:49 · 820 阅读 · 0 评论 -
STL:标准输出-格式化输出(flush、put、write、width、fill、setf【进制】、unsetf)
cout.flush()//刷新缓冲区cout.put()//向缓冲区写一个字符cout.write()//向缓冲区写字符串cout.width()//设置输出长度cout.fill()cout.setf(标记)//设置输出格式cout.unsetf(标记)//卸载输出格式解释:不会输出在屏幕上,只有刷新缓冲区才会输出cout << "hello world";刷新缓冲区方法:方法一: << endl;cout << "hello world"原创 2022-01-07 09:41:38 · 937 阅读 · 0 评论 -
STL:C++输入输出流、缓冲区(cin、get、getline、ignore、peek、putback)
一.输入输出流键盘输入数据到程序——标准输入input(cin);程序数据输出到显示器——标准输出output(cout);标准输入+标准输出=标准I/O文件的输入和输出——文件I/O。cout;//标准输出—输出数据到显示器cin;//标准输入—输出数据到显示器cerr;//标准错误—输出数据到显示器clog;//标准日志—输出数据到显示器cerr和clog区别:cerr没有缓冲区,clog有缓冲区。二.缓冲区三.标准输入流标准输入流cin,重点掌握函数,如下:cin.原创 2022-01-06 20:59:47 · 1694 阅读 · 0 评论 -
STL:手写copy和异常处理
代码如下://抽象类,异常基类,不能被实例化,但是可以用引用class BaseMyException {public: virtual void what() = 0;//纯虚函数 virtual ~BaseMyException(){}};//目标类为空class TargetSpaceNullException :public BaseMyException {public: virtual void what() { cout << "目标空间为空!" <&原创 2022-01-06 14:32:33 · 63 阅读 · 0 评论 -
STL:标准异常类使用、编写自己的异常类
一.标准异常类这个大哥写的很详细:http://c.biancheng.net/view/2333.html下面实现一个out_of_range的标准异常类。案例:实现一个类,异常人的年龄应该在0<age<120之间,否则抛出异常。注意:1. 引入对应头文件。2. 修改类参数。#include <iostream>#include <stdexcept>//引入头文件using namespace std;class Person {public:原创 2022-01-06 11:22:11 · 131 阅读 · 0 评论 -
STL:异常对象生命周期
一.普通类型生命周期普通类型:catch (MyException e)class MyException {public: //有参构造 MyException() { cout << "构造函数!" << endl; } //拷贝构造 MyException(const MyException& another) { cout << "拷贝构造!" << endl; } ~MyException() { cout原创 2022-01-06 09:45:25 · 257 阅读 · 0 评论 -
STL:异常借口申明
一.指定函数智能抛出规定类型异常//这个函数只能抛出int,float,char三种类型异常,抛出其他的就报错void func01() throw(int, float, char) {}//不能抛出任何异常void func02() throw() {}//可以抛出任何异常void func03() {}案例1://这个函数只能抛出int,float,char三种类型异常,抛出其他的就报错void func01() throw(int, float, char) { t原创 2022-01-05 15:51:59 · 67 阅读 · 0 评论 -
STL:栈解旋
栈解旋概念:当throw抛出异常后,创建的class类对象就会被析构。案例:class Person {public: Person() { cout << "对象构建!" << endl; } ~Person() { cout << "对象析构!" << endl; }};//栈解旋概念:当throw y抛出异常后,p1、p2就行进行析构函数。int divide(int x, int y) { Person p1, p2;原创 2022-01-05 15:30:00 · 87 阅读 · 0 评论 -
STL:异常理论概念
一.基本语法案例:除数为0.//异常基本语法int divide(int x, int y) {//除法,分母不能为0 if (y == 0) { throw y;//抛出异常 } return x / y;}void test01() { //试着捕获异常 try { divide(10, 0);//分母为0 } //异常根据类型进行匹配,y是int型,所以这里是int型,用exception接收y catch (int exception) { cout <原创 2022-01-05 14:42:41 · 467 阅读 · 0 评论 -
STL:类型转换基本语法
一.static_cast实现static_cast:用于一般数据类型(int,float,char,string,double)、具有继承关系的指针或引用。//static_castvoid test01() { int a = 65;//A的ASCII值是65 char c = static_cast<char>(a); cout << c << endl;}结果:二.dynamic_cast实现转换具有继承关系的指针或引用,在转换前会进行.原创 2022-01-05 13:54:28 · 739 阅读 · 0 评论 -
STL:模板类手写数组
#include <iostream>using namespace std;template<class T>class MyArray { friend void test01();//友元函数public: MyArray(int capacity)//构造函数 { this->mCapacity = capacity; this->mSize = 0; //申请空间 this->ptr = new T[this->mCa原创 2022-01-05 10:04:09 · 83 阅读 · 0 评论 -
类模板分文件编写:错误 LNK2019 无法解析的外部符号 “public: __cdecl Person
错误:代码:Person.h#pragma once#include <iostream>using namespace std;template<class T1,class T2>class Person{private: T1 mName; T2 mAge;public: Person(T1 name, T2 age); void Show();};Person.cpp#include "Person.h"template<cla原创 2022-01-04 18:00:18 · 606 阅读 · 2 评论 -
STL:类模板
一.使用类模板和函数模板的定义和使用类似。函数模板:https://blog.csdn.net/weixin_44190648/article/details/121934692有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。类模板用于实现类所需数据的类型参数化。类模板在表示数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的数据类型的影响。类模板必须显式指定类型。类模板在调用时候,可以自动推导类型。template<class T>class原创 2022-01-04 17:14:14 · 412 阅读 · 0 评论 -
STL:函数模板(基本语法、原理)、与普通函数一起调用区别
1.STL作用:由于C++相比较于Java没有交换函数,所以每次需要使用时,都需要自己写一个,并且还会出现数据类型不同,就要编写不同的函数,非常麻烦。因此,出现STL。模板技术、类型参数化,编写代码可以忽略类型。//int型交换void Myswap(int& a, int& b) { int temp; a = temp; a = b; b = temp;}//double型交换void Myswap(double& a, double& b) {原创 2021-12-30 18:03:38 · 527 阅读 · 0 评论