05 2022 档案
摘要:算法简介:set_intersection // 求两个容器的交集set_union // 求两个容器的并集set_difference // 求两个容器的差集 set_intersection 功能描述:求两个容器的交集函数原型:set_intersection(iterator beg1, it
阅读全文
摘要:算术生成算法属于小型算法,使用时包含的头文件为 #include <numeric> accumulate // 计算容器元素累计总和fill // 向容器中添加元素 accumulate 功能描述:计算区间内 容器元素累计总和函数原型:accumulate(iterator beg, iterat
阅读全文
摘要:算法简介:copy // 容器内指定范围的元素拷贝到另一容器中replace // 将容器内指定范围的旧元素修改为新元素replace_if // 容器内指定范围满足条件的元素替换为新元素swap // 互换两个容器的元素 copy 功能描述:容器内指定范围的元素拷贝到另一容器中函数原型:copy(
阅读全文
摘要:算法简介:sort //对容器内元素进行排序random_shuffle //洗牌 指定范围内的元素随机调整次序merge // 容器元素合并,并存储到另一容器中reverse // 反转指定范围的元素 sort 功能描述:对容器内元素进行排序 函数原型:sort(iterator beg, ite
阅读全文
摘要:算法简介:find //查找元素find_if //按条件查找元素adjacent_find //查找相邻重复元素binary_search //二分查找法count //统计元素个数count_if //按条件统计元素个数 find 功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束
阅读全文
摘要:算法简介:for_each //遍历容器transform //搬运容器到另一个容器中 for_each 功能描述:实现遍历容器函数原型:for_each(iterator beg, iterator end, _func);// 遍历算法 遍历容器元素// beg 开始迭代器// end 结束迭代
阅读全文
摘要:算法主要是由头文件 <algorithm> <functional> <numeric> 组成。<algorithm> 是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等<numeric> 体积很小,只包括几个在序列上面进行简单数学运算的模板函数<function
阅读全文
摘要:标准函数库algroithm中的函数,用于搬运容器函数 transform(被搬运容器初始,被搬运容器终止,搬运到容器初始,搬运过程中运算仿函数) 注意,使用时要先给搬运到容器初始化足够的空间
阅读全文
摘要:概念:STL内建了一些函数对象分类:算术仿函数关系仿函数 逻辑仿函数用法:这些仿函数所产生的对象,用法和一般函数完全相同使用内建函数对象,需要引入头文件 #include<functional> 算术仿函数 功能描述:实现四则运算其中negate是一元运算,其他都是二元运算仿函数原型:templat
阅读全文
摘要:概念:返回bool类型的仿函数称为谓词如果operator()接受一个参数,那么叫做一元谓词如果operator()接受两个参数,那么叫做二元谓词 本身是仿函数的一个种类,其本质依旧是类,注意,类名后要加()才是函数对象,否则只是一个类 class getfind { public: bool op
阅读全文
摘要:find_if(begin,end,谓词) 在algroaim标准库中,作用是以谓词中的实现为标准,从begin到end进行查找,并返回一个迭代器,为第一个查找到的位置
阅读全文
摘要:仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中重载一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。 c++中对类的()进行重载 数据类型 operator()(变量){} 使用的时候直接person p;p()就可以使用了 因为用起来像函数,所
阅读全文
摘要:正常的情况下是从小到大,如果想改变就要使用仿函数在构造的时候就改变,和set一样。这里只传入int是因为排序的key数据是int数据,如果排序的key数据是自定义数据,那就一定要写仿函数了,就像set里边一样 class mycompare { public: bool operator()(int
阅读全文
摘要:函数原型:find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();count(key); //统计key的元素个数 和set一样的操作
阅读全文
摘要:函数原型:insert(elem); //在容器中插入元素。clear(); //清除所有元素erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(key);
阅读全文
摘要:size(); //返回容器中元素的数目empty(); //判断容器是否为空swap(st); //交换两个集合容器 跟set一样,没区别
阅读全文
摘要:函数原型:构造:map<T1, T2> mp; //map默认构造函数: map(const map &mp); //拷贝构造函数赋值:map& operator=(const map &mp); //重载等号操作符 ()构造和=赋值,构造和赋值的方式种类也很少 除了要注意构造时模板参数列表中有两个
阅读全文
摘要:简介:map中所有元素都是pairpair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值自动排序本质:map/multimap属于关联式容器,底层结构是用二叉树实现。优点:可以根据key值快速找到value值map和multimap区别:map不
阅读全文
摘要:set容器默认排序规则为从小到大,如果想改变,就要使用仿函数,仿函数本质是一个数目类型 因为他本身就会排序,所以改变排序要从初始化的时候就开始。 自定义的数据类型都是会自己定义一个排序顺序 class mycompare { public: bool operator()(int v1,int v2
阅读全文
摘要:功能描述:成对出现的数据,利用对组可以返回两个数据 两种创建方式:pair<type, type> p ( value1, value2 );pair<type, type> p = make_pair( value1, value2) 也就是用pair创造包含两个数据类型的变量,而这两个数据类型绑
阅读全文
摘要:#include <typeinfo>// c++输出数据类型 template<typename T> void PrintDataType(T var_) { cout << typeid(var_).name() << endl; }typeid().name()的作用就是数据数据类型,一般输
阅读全文
摘要:函数原型:find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();count(key); //统计key的元素个数 注意find返回的是一个迭代器,到现在为止学到过的迭代器的.end()都是空的数据位NULL,这种时候如果硬要解引用一般生成的是
阅读全文
摘要:函数原型:insert(elem); //在容器中插入元素。clear(); //清除所有元素 erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(elem)
阅读全文
摘要:size(); //返回容器中元素的数目 empty(); //判断容器是否为空swap(st); //交换两个集合容器 和之前其他的容器方式相似,不同的就是没有resize这种操作,比如本来有5个,resize10,这个时候0就重复了,从逻辑上来说就不符合
阅读全文
摘要:构造:set<T> st; //默认构造函数:set(const set &st); //拷贝构造函数赋值:set& operator=(const set &st); //重载等号操作符 构造和赋值操作与之前相似,只是少好几种种类 multiset与set是相同的操作,默认其中是从小到大的顺序 而
阅读全文
摘要:集合/关联式容器,所有的元素在插入的时候都会被自动的排序,其底层是二叉树 而set和multiset的唯一区别就是set中不能有重复元素,multiset可以有重复元素,其他都一样,也公用一个set头文件
阅读全文
摘要:函数原型:reverse(); //反转链表sort(); //链表排序 reverse,直接反转链表中的顺序,猜测就是直接将链表中的begin和end换了,毕竟本身就是双向循环列表,连指针都不用重连 sort,对链表进行排序,默认是从小到大,注意,这个sort不能使用标准算法中的sort,也就是s
阅读全文
摘要:front(); //返回第一个元素。back(); //返回最后一个元素。 这类与之前一样,但是没有了at和[]的方式,因为list本身是链表,他不是连续的空间,并且迭代器不支持跳跃访问,所以不支持用at或者[]直接访问中间的数据。 想要访问中间的 数据只能生成一个迭代器,然后不断地++或者--才
阅读全文
摘要:函数原型:push_back(elem);//在容器尾部加入一个元素pop_back();//删除容器中最后一个元素push_front(elem);//在容器开头插入一个元素pop_front();//从容器开头移除第一个元素insert(pos,elem);//在pos位置插elem元素的拷贝,
阅读全文
摘要:函数原型:size(); //返回容器中元素的个数empty(); //判断容器是否为空resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除。resize(num, elem); //重新指定容器的长度为num
阅读全文
摘要:函数原型:assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。assign(n, elem); //将n个elem拷贝赋值给本身。list& operator=(const list &lst); //重载等号操作符swap(lst); //将lst与本身的元素
阅读全文
摘要:函数原型:list<T> lst; //list采用采用模板类实现,对象的默认构造形式:list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。list(n,elem); //构造函数将n个elem拷贝给本身。list(const list &lst); //拷贝构造
阅读全文
摘要:链表容器,数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的,链表由一系列结点组成,每个节点由一个是存储数据元素的数据域和存储下一个结点地址的指针域组成,链表有单向链表,双向链表,循环链表,STL标准模板库(Standard Tem
阅读全文
摘要:先进先出的数据结构,队列类 队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据称为 入队 push队列中出数据称为 出队 pop 功能描述:栈容器常用的对外接口 构造函数:queue<T> que; //queue采用模板类实现,q
阅读全文
摘要:一种先进后出的数据,只有一个出口,实际上就是栈类 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为栈中进入数据称为 入栈 push栈中弹出数据称为 出栈 pop 功能描述:栈容器常用的对外接口 构造函数:stack<T> stk; //stack采用模板类实现, stack对象的默认构造形
阅读全文
摘要:#include<ctime> srand((unsigned int)time(NULL));//为了防止每次产生的随机数都相同
阅读全文
摘要:赋值操作函数原型:deque& operator=(const deque &deq); //重载等号操作符assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。assign(n, elem); //将n个elem拷贝赋值给本身。 也是和vector基本一致,=和
阅读全文
摘要:函数原型:deque<T> deqT; //默认构造形式deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。deque(n, elem); //构造函数将n个elem拷贝给本身。deque(const deque &deq); //拷贝构造函数 构造函数和ve
阅读全文
摘要:使用const形参的目的是为了调用函数时不改变容器中的值,这种时候,容器的迭代器也要换成const的,否则会出错 void printdeque(deque<int>const &d) { for (deque<int>::const_iterator i = d.begin(); i != d.e
阅读全文
摘要:双端数组,与vector主要的区别就在于是否可以在头尾两边都进行插入和删除,vector就像是栈,deque就像是队列,但是在使用时,vector访问元素的速度要比deque更快,这与其内部实现有关 deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据,中控器维护的是每个缓冲区的地
阅读全文
摘要:函数原型:reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。 简单来说就是直接给capacity赋值,预留位置的时候,原有的元素不会改变,因为如果数据量较多,那么在运行时会多次重开辟内存,比较耗时,所以最好的办法就是在开始时就直接预留足够的内存 统计开
阅读全文
摘要:函数原型:swap(vec); // 将vec与本身的元素互换 这个交换是完全交换,不只是其中的数据,还有size,capacity这些属性都会进行交换 这个交换有一个很有用的地方,就是收缩内存空间,上次说过,resize只是改变了size,没有改变capacity,也就是说,即使这个时候不用这么大
阅读全文
摘要:匿名对象(临时对象)是一种自动构造,自动析构,在本行执行完之后,就会自动销毁通常以下三种情况会产生匿名对象: 1.以值的方式给函数传参,会产生临时对象,为方便区分,称为"参数匿名对象"; Cat(); —> 生成了一个匿名对象,执行完Cat( )代码后,此匿名对象就此消失。这就是匿名对象的生命周期。
阅读全文
摘要:只有类的成员函数才能在函数名后面加上const,这时成员函数叫做常量成员函数。 常量成员函数在执行期间不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(同样的静态成员函数除外)
阅读全文
摘要:函数原型:at(int idx); //返回索引idx所指的数据operator[]; //返回索引idx所指的数据front(); //返回容器中第一个数据元素back(); //返回容器中最后一个数据元素 和string基本一样,只是多出了首尾数据直接调用
阅读全文
摘要:函数原型:push_back(ele); //尾部插入元素elepop_back(); //删除最后一个元素insert(const_iterator pos, ele); //迭代器指向位置pos插入元素eleinsert(const_iterator pos, int count,ele); /
阅读全文
摘要:函数原型:empty(); //判断容器是否为空capacity(); //容器的容量size(); //返回容器中元素的个数resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除。resize(int
阅读全文
摘要:函数原型:vector& operator=(const vector &vec); //重载等号操作符 assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。assign(n, elem); //将n个elem拷贝赋值给本身 这个操作和之前的string基本相同
阅读全文
摘要:函数原型:vector<T> v; //采用模板实现类实现,默认构造函数vector(v.begin(), v.end()); //将v[begin(), end())区间中的元素拷贝给本身。vector(n, elem); //构造函数将n个elem拷贝给本身。vector(const vecto
阅读全文
摘要:使用就像单端数组 不同于数组是固定的空间,而是动态扩展的,他的动态扩展不是链表那样在原来的基础上继续扩展的,而是会直接开辟新的更大的空间,然后拷贝后删除原空间。他是单边的,只有一个边进一个边出,像是队列,同时它的迭代器也是支持随机访问的 v.begin代表的是最开始的值,头上的值,v.end代表的是
阅读全文
摘要:功能描述:从字符串中获取想要的子串函数原型:string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串
阅读全文
摘要:函数原型:string& insert(int pos, const char* s); //插入字符串string& insert(int pos, const string& str); //插入字符串string& insert(int pos, int n, char c); //在指定位置
阅读全文
摘要:string中单个字符存取方式有两种 char& operator[](int n); //通过[]方式取字符char& at(int n); //通过at方法获取字符 这两个的效果一样,可以进行字符的读写,同时注意字符串可以通过.size()函数判断字符串的大小
阅读全文
摘要:比较方式:字符串比较是按字符的ASCII码进行对比= 返回 0> 返回 1< 返回 -1 函数原型:int compare(const string &s) const; //与字符串s比较int compare(const char *s) const; //与字符串s比较 比较的时候从前到后比较
阅读全文
摘要:功能描述:查找:查找指定字符串是否存在替换:在指定的位置替换字符串函数原型:int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找int find(const char* s, int pos = 0) cons
阅读全文
摘要:主要用于在已有字符串之后追加 函数原型:string& operator+=(const char* str); //重载+=操作符string& operator+=(const char c); //重载+=操作符string& operator+=(const string& str); //
阅读全文
摘要:赋值的函数原型:string& operator=(const char* s); //char*类型字符串 赋值给当前的字符串string& operator=(const string &s); //把字符串s赋给当前的字符串string& operator=(char c); //字符赋值给当
阅读全文
摘要:c++的string本身本质上是一个类,类中管理一个c语言类型的char*指针 用类的好处就是其中有很多的封装,并且可以自动管理内存 构造函数原型:string(); //创建一个空的字符串 例如: string str; string(const char* s); //使用字符串s初始化stri
阅读全文
摘要:嵌套容器和别的没什么区别,只是说循环也变成了嵌套,同时注意两个>> 中要有等号 迭代器解引用后依旧是迭代器中显示的容器中保存数据类型 vector<vector<int> > v; for (vector<vector<int> >::iterator it = v.begin(); it != v
阅读全文
摘要:vector容器是标准容器的一种,可以存放各种数据,使用模板编写成的,所以使用的时候要首先像模板一样先声明其中的数据类型,同时要include容器 #include<vector> vector<int> v; vector容器本身集成了很多的函数,可以调用,比如begin,end函数等 v.pus
阅读全文
摘要:为了建立数据结构和算法的一套标准,形成了stl 主要目的是提高复用性 stl 标准模板库,可以分为容器,算法,迭代器,容器和算法间通过迭代器进行拼接,主要使用模板 细分有6各组件,容器,算法,迭代器,仿函数,适配器,空间配置器 1. 容器:各种数据结构,如vector、list、deque、set、
阅读全文
摘要:问题:类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到解决:解决方式1:直接包含.cpp源文件,而不是包含.h文件解决方式2:将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制,相当于将.h和.cpp写在一起 只有类模板中会使用.hpp文件 不过这个其
阅读全文
摘要:类外实现的时候要说明这是一个模板以及模板的通用变量 template<typename T1 ,typename T2> class person { public: person(T1 name,T2 age); void showperson(); T2 age; T1 name; }; tem
阅读全文
摘要:当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型如果不指定,编译器无法给子类分配内存如果想灵活指定出父类中T的类型,子类也需变为类模板 template<typename T> class base { public: T m; }; class son1 : public
阅读全文
摘要:1. 指定传入的类型 直接显示对象的数据类型,最常用的 void printperson1(person<string,int> &p) 2. 参数模板化 将对象中的参数变为模板进行传递 template<typename T1 ,typename T2> void printperson2(per
阅读全文
摘要:普通类中的成员函数一开始就可以创建类模板中的成员函数在调用时才创建 模板中的数据类型只有在调用的时候才能确定,之前都是不确定的
阅读全文
摘要:1. 类模板没有自动类型推导的使用方式 person<string,int>p1("tom",10);//正确 person p1("tom",10);//错误,他不会自动进行推导 2. 类模板在模板参数列表中可以有默认参数 template<typename NameType ,typename
阅读全文
摘要:构建一个通用的类,类中的数据类型不具体制定,用一个虚拟的类型来代表 template <typename T> 类 和函数模板基本一致 template<typename NameType,typename AgeType> class person { public: person(NameTyp
阅读全文
摘要:比如数组的比较,就没法通过简单的比对函数进行 这种情况下要进行函数模板的重载,或者进行运算符重载 template<> bool compare (person &a,person &b)
阅读全文
摘要:1. 如果函数模板和普通函数都可以实现,优先调用普通函数2. 可以通过空模板参数列表来强制调用函数模板 myPrint<>(a, b)3. 函数模板也可以发生重载4. 如果函数模板可以产生更好的匹配,优先调用函数模板
阅读全文
摘要:主要区别在于隐式类型转换 普通函数调用时可以发生自动类型转换(隐式类型转换)函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换如果利用显示指定类型的方式,可以发生隐式类型转换
阅读全文
摘要:自动类型推导,必须推导出一致的数据类型T,才可以使用,T不会在一个模板函数调用中代表两个意义模板必须要确定出T的数据类型,才可以使用,也就是说函数模板必须说明或者自动分析出typename模板变量 因为模板不能直接调用 typename可以改成class,两者区别不大,在模板定义的时候可以混用 te
阅读全文
摘要:c++模板是通用的模具,用于提高复用性 模板不可以直接使用 这是一种思想,叫做泛式编程,有两种模板,函数模板和类模板 函数模板用于建立一个通用函数,函数返回值和形参类型不具体指定,用一个虚拟类型来表示 函数模板声明template<typename T> template 声明创建模板typenam
阅读全文