一、vector常见用法详解

  1. vector翻译为向量,但是这里翻译成变长数组的叫法更好理解。
  2. 如果typename是一个STL容器,定义的时候要记得在>>符号之间加上空格,因为在C++11之前标准的编译器会把他当成位移操作。vector<vector > name;
  3. vector Arrayname[arrySize]和vector<vector > name不一样,其中定义为数组的即第一个中每个都是一个vector容器,一维长度已经固定为arrySize的大小。
  4. vector元素访问有两种方式,一种是通过下标,还有一种是通过迭代器,通过下标访问和普通数组是一样的操作,重点是通过迭代器访问,vector::iterator it;可以把迭代器理解成像指针一样的东西,通过*it可以访问vector里面的内容。在C++11中特别是在for循环中可以写成auto it
  5. v[i]和*(v.begin()+i)是等价的
  6. 左闭右开记住这个思想
  7. 迭代器中还实现了两种自加操作:++it和it++(自减同理)迭代器支持it < v.end()因此循环条件一般使用it != v.end()
  8. 在常用STL容器中,只有vector和string中才允许使用v.begin()+i这种迭代器上加数字的写法。
  9. 迭代器:vector<typename>::iterator it;

常用函数:

  1. push_back()就是在vector后添加一个元素,时间复杂度为O(1)
  2. pop_back()就是在vector末尾删除一个元素,时间复杂度为O(1)
  3. size()用来获得vector中元素的个数,时间复杂度为O(1),size返回的是unsigned类型,这一点对所有的STL都是一样的。
  4. clear()用来清空vector中所有的元素
  5. insert(it, x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度为O(N)
  6. erase()有两种用法删除单个元素,删除一个区间内的所有元素,时间复杂度均为O(N),erase(it)删除迭代器为it位置处的元素;erase(first, last)例如erase(v.begin(), v.begin()+i),左闭右开。

常见用法:

  1. 存储数据本身可以作为数组使用
  2. 用邻接表存储图

二、set的常见用法详解

  1. set翻译为集合,是一个内部自动有序且不含重复元素的容器。
  2. set容器的元素只能通过迭代器(iterator)访问。
  3. set内的元素自动递增排序,且自动去除了重复元素。
  4. 迭代器:set::iterator it;

常见函数用法:

  1. insert(x)可以将x插入set容器中,并自动递增排序和去重,时间复杂度O(logN)。
  2. find(value)返回set中对应值为value的迭代器。时间复杂度同上。
  3. erase()有两种用法,删除单个元素;删除一个区间的所有元素。删除单个元素有两种方法:(1)st.erase(it),it为所需删除元素的迭代器,时间复杂度为1,结合find()函数使用(2)st.erase(value),value为所需删除元素的值,时间复杂度为O(logN);然后是删除区间元素st.erase(first, last)记住这里都是迭代器。
  4. size()用来获得set内元素的个数,时间复杂度为1
  5. clear()用来清空set中的所有元素,时间复杂度为O(N)。

常见用途:

  1. 主要作用是存储自动去重和升序。
  2. 如果需要处理不唯一的则需使用multiset,C++11中还加了unorder_set,以散列代替set内部的红黑树,可以实现只去重不排序的需求。

三、string的常见用法详解

  1. 在C语言中,一般是使用字符串数组来表示字符串的即char str[],但是C++直接引入string数据类型。
  2. string str;
  3. string可以如同字符串数组一样通过下标来访问;也可以通过迭代器来访问。
  4. 如果要读入或输出整个字符串只能够使用cin或cout,如果强行使用printf输出,可以使用c_str()函数将string强制转化为字符串数组,解决这个问题,printf("%s", str.c_str());
  5. string迭代器不像其他容器那样需要参数,string::iterator it;
  6. 同vector一样可以进行数字操作迭代器

常见函数:

  1. 可以直接进行拼接操作 str += str2;
  2. compare operator ,可以直接进行比较,是按照字典序来的
  3. length()/size(), length()返回string的长度,时间复杂度为1
  4. insert()有多种方法,时间复杂度为O(n),(1)insert(pos, string),pos是下标号,string是要插入的str,(2)insert(it, it2, it3),it是原字符要插入的位置,是迭代器,it2,it3是为待插入字符串的首尾迭代器。
  5. erase(),有两种用法,删除单个元素、删除一个区间内的所有元素,时间复杂度均为O(N),str.erase(it),it为要删除的迭代器,str.erase(first, last),区间迭代器。str.erase(pos, length),删除位置开始处,length接下来需要删除的长度。
  6. clear(),清空所有元素,时间复杂度为1.
  7. substr()提取字符串中子串, substr(pos, len)pos为位置,len为长度。
  8. string::npos是一个常数,其本身值为-1,可以作为find函数失配的返回值。
  9. find()返回出现的位置,str.find(str2), str.find(str2, pos),pos是指定开始查找位置。
  10. replace(), str.replace(pos, len, str2),把str从pos号位置开始,长度为len的子串替换为str2.

四、map的常见用法详解

  1. map翻译为映射,也是常用的STL容器。因为map可以将任何基本类型映射到任何基本类型。
  2. map<typename1, typename2> mp;如果是字符串映射到整数,必须使用string而不能使用char数组。
  3. 访问方式,使用下标访问,也就是键值。也可以使用迭代器访问,和其他迭代器访问方式一样。
  4. map可以使用it->first来访问键值,使用it->second来访问值。
  5. map会以键值从小到大的顺序自动排序,因为map内部也是使用红黑树实现的。

常见函数:

  1. find(key)返回键值为key的映射的迭代器
  2. erase(),也有两种用法,单个和区间,mp.erase(it/key)注意是迭代器或是键值即可,区间都是迭代器。
  3. size(),用来返回map中的对数。
  4. clear(),清空所有元素。

常见用途

  1. 需要建立字符与整数之间的联系
  2. 判断大整数或其他类型是否存在,当bool类型使用
  3. 字符串和字符串之间的映射也有可能会遇到。

五、queue的常见用法详解

  1. queue翻译为队列,在STL中主要实现了一个先进先出的的容器
  2. queue内元素访问,因为队列本身是一种先进先出的数据结构,因此只能通过front()来访问队首元素,通过back()来访问队尾元素,通过push()来将元素压入队列。

常见函数:

  1. push(x), 将元素x压入队列,时间复杂度为1.
  2. front()、back()分别用于访问队首和队尾元素。
  3. pop(),让队首元素出列。
  4. empty()检查队列是否为空,如果为空返回true,否则返回false
  5. size()返回queue内元素的个数

主要用途:

  1. 当实现广度优先搜索时,可以不用自己动手实现一个队列。
  2. 在使用front()back()时,必须先使用empty()判断队列是否为空,否则会出现错误。

六、priority_queue的常见用法详解

  1. priority_queue又称优先队列,由名字可知队首元素是当前队列中优先级最高的那一个,底层使用堆来进行实现。可以在任何时候使用push()加入元素,会自动调整使得队首优先级最高。
  2. 优先队列元素访问,和队列不一样,没有front()和back()函数,只能通过top()函数来访问队首元素。

常见函数:

  1. push()
  2. top()
  3. pop()
  4. empty()
  5. size()

priority_queue内元素优先级设置

  1. 基本数据类型优先级设置:
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;//记得最后这两个>>是有空格的,以上两种方法等效对于基本数据类型而言,如果想换数据类型,只需把对应位置的换掉即可,这个是默认优先级数字越大越高,如果想要换成数字低优先级高,可以把less<int> 换成greater<int>.
  1. 结构体的优先级设置,相对而言更为重要
struct fruit{
string name;
int price;
}
//如果希望价格高的优先级高,就需要重载小于号<,如下:
struct fruit{
string name;
int price;
friend bool operator < (fruit f1, fruit f2){
return f1.price < f2.price;//注意这里是小于号<,跟cmp里面的符号设置相反。原因在于优先队列默认就是把优先级高的放在队首,记住和cmp中相反即可。
}
}
//接下来就可以进行设置fruit类型的队列了,其内部就是价格高的为优先级高,如果想要价格低的优先级高,只需把上面return中的<号换成>号
priority_queue<fruit> q; //也可将结构体中的部分写在外面,如下:
struct cmp{
bool operator () (fruit f1, fruit f2){
return f1.price < f2.price;
}
}
//上面注意我们把friend去掉了,同时把<号改成了()
//使用之前第二种方式来定义:
priority_queue<fruit, vector<fruit>, cmp> q;//把之前的less<>换成了cmp //最后指出如果结果体或数据较大,建议使用引用来提高效率,在比较类参数上加上const和&
friend bool operator < (const fruit &f1, const fruit &f2){
return f1.price < f2.price;//注意这里是小于号<,跟cmp里面的符号设置相反。原因在于优先队列默认就是把优先级高的放在队首,记住和cmp中相反即可。
}

常见用途

  1. 可以用于贪心算法,也可以解决Dijkstra算法进行优化
  2. 同样在使用前需要用empty()进行判断

七、stack的常见用法详解

  1. stack翻译为栈,是STL中实现后进先出的容器。
  2. 定义同其他容器一样
  3. 内部元素访问,只能通过top()来访问栈顶元素。

常见函数

  1. push()
  2. top()
  3. pop()
  4. empty()
  5. size()

常见用途:

  1. 一般来模拟实现一些递归,防止程序对栈内存限制导致程序运行出错。

八、pair的常见用法详解

  1. pair是一个很实用的东西,当想把两个元素绑在一起作为一个合成元素,又不想定义结构体时,pair可以很合适的作为一个替代品。
  2. pair应添加头文件<utility>
  3. pair定义:
pair<typename1, typename2> name;
//定义时初始化
pair<string, int> p("haha", 5);
//如果想定义临时pair,下面两种方法都可以
pair<string, int>("haha", 5);
make_pair("haha", 5);
  1. 元素访问,如同结构体一样即可p.first,p.second
  2. 比较操作数,可以直接进行比较,先用first进行比较,如果first相等,那么再使用second进行比较。
  3. 常见用途:作为map的键值对来进行插入如下:
map<string, int> mp;
mp.insert(make_pair("haha", 5));

九、algorithm头文件下常见函数

  1. max(x, y) min(x, y) abs(x) abs(x)中的x必须是整数,如果是浮点数请使用math头文件下的fabs(x)
  2. swap(x,y),用于交换想x,y的值
  3. reverse(it, it2)可以将数组指针在左闭右开之间的元素或容器迭代器范围内的元素进行反转。
  4. next_permutation(a, a+3),全排序列,使用do...while()
  5. fill(),可以把数组或容器中的某一段区间赋值为一个相同的元素,和memset中不同,这里的数字是可以为类型范围类对应的所有值。fill(a, a+5, 233);
  6. sort(),排序函数
  7. lower_bound()和upper_bound()详解见这里:https://www.cnblogs.com/tsruixi/p/11858226.html

日常笔记6C++标准模板库(STL)用法介绍实例的更多相关文章

  1. C++_标准模板库STL概念介绍1-建立感性认知

    标准模板库的英文缩写是STL,即Standard Template Library. STL里面有什么呢? 它提供了一组表示容器.迭代器.函数对象和算法的模板. 容器是一个与数组类似的单元,可以存储若 ...

  2. C++_标准模板库STL概念介绍5-其他库与总结

    C++还提供了其他一些类库,这些类库更加专用. 例如,头文件complex为复数提供了类模板complex,包含用于float.long和long double的具体化. 这个类提供了标准的复数运算以 ...

  3. C++_标准模板库STL概念介绍4-算法

    STL包含很多处理容器的非成员函数: sort() copy() find() random_shuffle() set_union() set_intersection() set_differen ...

  4. C++_标准模板库STL概念介绍3-函数对象

    函数对象也叫做函数符(functor). 函数符是可以以函数方式和( )结合使用的任意对象. 包括函数名,指向函数的指针,重载了()运算符的类对象. 可以这样定义一个类: class Linear { ...

  5. C++_标准模板库STL概念介绍2-泛型编程

    有了之前使用STL的经验后,接下来讨论泛型编程及其底层的理念: 首先我们知道STL只是泛型编程的一种: 而面向对象的编程方式关注的是编程的数据方面: 而泛型编程关注的是算法: 但是,他们之间的一个重要 ...

  6. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  7. C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...

  8. 标准模板库(STL)学习探究之stack

    标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string

  9. C++ 标准模板库(STL)

    C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...

随机推荐

  1. AsyncTask下载网络图片

    MyTask task = new MyTask(); task.execute(url); class MyTask extends AsyncTask<String, Integer, Bi ...

  2. dbms_file_transfer使用简介

    dbms_file_transfer这个包可以在两个位置传输文件,分别可以有以下位置: a 从一个asm diskgroup传输到另外一个asm diskgroup b 从一个asm diskgrou ...

  3. 懒加载 lazy load

    懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据, 而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用. 比 ...

  4. 【HDOJ】1239 Calling Extraterrestrial Intelligence Again

    这题wa了很多词,题目本身很简单,把a/b搞反了,半天才检查出来. #include <stdio.h> #include <string.h> #include <ma ...

  5. amaze UI 笔记 - JS

    导航添加依据 http://amazeui.org/javascript 下面内容属学习笔记,如有理解偏差和错误请留言相告,感谢!* =(官网这块写的很详细) 一 .UI增强 1.警告框 显示可关闭的 ...

  6. .Net 更容易的使用配置文件 SuperConfig

    一.原始配置文件的问题 我们在做开发时,不管是B/S还是C/S,现在几乎所有的项目都会碰到使用配置文件,简单点的如链接字符串.上传路径啊,一些API的接口地址等等.复杂点就更多了,如ActiveMQ的 ...

  7. 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15

    上篇的内容,我们探讨了分布式计算中的MapReduce与批处理.所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供 ...

  8. golang接口三个特性

    类型和接口 因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍.go是一个静态性语言,每个变量都有静态的类型,因此每个变量在编译阶段中有明确的变量类型,比如像:int.float32.MyTy ...

  9. 4、hello world

    package com.ourteam.firstexample; import io.netty.bootstrap.ServerBootstrap;import io.netty.channel. ...

  10. vue filter过滤器简单应用

    vue中过滤器,用于一些常见的文本格式化,用 | 来操作. 过滤器可以用在两个地方: 1.在{{}}双花括号中插入值 2.v-bind表达式中使用 <!-- 在双花括号中 --> {{ m ...