C++STL常用函数

  C++的STL提供给我们很多方便的操作,可以从C语言中一些繁琐的操作中解放出来。这篇文章就简要总结一下STL中常用的及其各自的常用函数。内容涉及:stack,queue,vector,string,unordered_set,unordered_map,set,map。

stack

1.简要描述:stack完成的功能是栈,即队列中后进先出
2.头文件:#include< stack>
3.定义格式:stack<变量类型> 栈名称; // 例如:stack< int> a;
4.常用函数:

push()  // 将变量压入栈顶
pop()  // 栈顶出栈,无返回值
top()  // 返回栈顶元素,不出栈
empty() // 判断栈是否为空,不空返回false,空返回true
size()  // 返回栈中元素的个数
swap(s,s1) // 交换两个栈(s,s1)中全部元素

queue

1.简要描述:queue完成的功能是队列,即先进先出
2.头文件:#include< queue>
3.定义格式:queue<变量类型> 队列名称; // 例如:queue< int> a;
4.常用函数:

front() // 获取队首元素,但并不删除
back() // 获取队尾元素,但并不删除
pop() // 删除队首元素,无返回值
push() // 向队列中加入元素,放置队列末尾
empty() // 判断队列是否为空,不空返回false,空返回true
size() // 返回队列中元素的个数

vector

1.简要描述:vector是容器,可以理解为C++中的数组/链表,访问可通过[]来完成
2.头文件:#include< vector>
3.定义格式:vector<变量类型> 数组名称; // 例如:vector< int> a;
4.常用函数:

push_back() // 尾部插入数组元素
pop_back() // 删除尾部数组元素
insert(a.begin()+i, num) // 将num插入第i+1个位置上,后面依次向后串位
erase(a.begin()+i) // 将第i+1个元素删除,后面依次向前串位
erase(a.begin()+i, a.begin()+j); // 删除区间[i, j-1]。区间从0开始
size() // 返回数组中元素个数
clear() // 清空数组元素,元素个数归为0
empty() // 判断数组是否为空,不空返回false,空返回true
resize() // 重新指定数组长度

begin()和end()怎么使用?
/*begin()和end()产生指向容器的第一个元素和最后一个元素的下一个位置的迭代器,常用于标记容器中元素的迭代范围。另外,容器还定义了rbegin()和rend(),返回指向容器最后一个元素和第一个元素的前一个位置的反向(reverse)迭代器。Begin()和end()与索引下标不同,所以不是int类型。*/
//输出指定的整型顺序容器的元素
Template<class T>
void printContainer(const char *msg, const T& s) {
    
    
	cout<<msg<<:;
	copy(s.begin(), s.end(), ostream_iterator<int>(cout, “ “))// ostream_iterator是用于输出的迭代器类,ostream_iterator<int>(cout, “ “) 绑定标准输出装置。“ ”代表每个字符以空格间隔
	cout<<endl;
}

string

1.简要描述:string是字符串模板类,可理解字符数组。访问元素可通过[]完成,对象赋值可使用=
2.头文件:#include< string>
3.定义格式:string a;
4.常用函数:

assign(s1, b, c) // 使用s1对象对a赋值,从b开始到c结束(0开始,左闭右闭)。缺省bc全部赋值
length()/size() // 返回字符串的长度
append(s1, b, c) //添加至字符串末尾,从b开始到c结束(0开始,左闭右闭)。缺省bc全部赋值
<<===!=>=> 对象间比较大小。
compare(b, c, s1,m,n) // 比较两string对象大小,bc是自己索引,mn是s1索引。均可缺省。返回值三种:大于0,等于0,小于0
swap(s2) // 本对象与s2对象交换内容
substr(m, n) // 取子串,从m索引开始,长度为n。n可缺省
replace(b,c,s1,m,n) //字符串替换,用s1的[m,n]替换原对象的[b,c]。c-b=n-m。
erase(b, c) // 删除子串[b,c],后面依次向前补。c可缺省,删除到底
insert(b, s1) // 在索引b处插入对象s1,原对象依次向后串
find(b, c) // 返回值是int型,返回出现指定字符的下标。b是内容,c是开始位置(可缺省)。常通过for循环使用,终止条件是:(position=s.find(b,c))!=string::npos

unordered_set

1.简要描述:unordered_set相当于一个集合,集合的组织无序。数量唯一,只是用来判断是不是存在。
2.头文件:#include<unordered_set>
3.定义格式:unordered_set< 数据类型> 变量名; //例如:unordered_set< int> a;
4.常用函数:

find() // 查找目标数值,找到返回迭代器。常使用的模板是s,find(a) != s.end()
count() // 返回指定值出现的次数,返回值为int型
empty() // 判断是否为空,不空返回false, 空返回true
size() // 返回数组大小
insert() // 插入元素,参数即插入的元素值
emplace() // 插入元素
erase() // 删除操作,两种方式:指定数值或者是迭代器。删除指定数值,返回值是0/1,代表是否删除成功。删除迭代器,返回值是下一个位置的迭代器。失败返回s.end()。

  注意:Insert()函数的功能是在vector容器的指定位置插入一个或多个元素;Emplace()是C++11新增的成员函数,用于在vector容器的指定位置之前插入一个新的元素。二者在功能上没有很大的区别。区别在于实现原理:Emplace()最大的作用是避免产生不必要的临时变量,直接在指定位置(in place)构造元素,只需要调用类的构造函数而无需调用复制构造函数。它的实现主要是依靠C++11的两个新特性:变参模板和完美转发。“变参模板”使得Emplace()可以接受任意参数,就可以适用于任意对象的构建。“完美转发”使得接收下来的参数 能够原样的传递给对象的构造函数。
更为详细内容可参考:https://www.cnblogs.com/narjaja/p/10039509.html

unordered_map

1.简要描述:unordered_map用于键值和数值的无序唯一排列,用于有二维要求的问题。也相当于一维数组,键值为索引,数值为数组值(赋值时可以这么理解使用[],遍历时不使用[])可以理解为集合中有多个相同无序元素。
2.头文件:#include<unordered_map>
3.定义格式:unordered_map<数据类型1,数据类型2> 变量名 // 例如:unordered_map<int, int> a;
4.常用函数:

begin()/end() // 迭代器,不是int型
size() // 返回有效元素的个数
empty() // 返回数组是否为空,不空返回false,空返回true
insert() // 插入元素,成对儿插入。插入的方式有两种:{0,1},pair<int, int>(0,1)。后者更常用
erase() // 删除元素,删除有两种类型:迭代器删除或键值删除。键值删除,返回值是删除的个数。例如:num = s.erase(1)——删除键值为1的元素,并返回个数给num。迭代器删除,返回值是下一个位置的迭代器。例如:iter = s.erase(s.begin())。Iter指向第二个元素的迭代器
clear() // 清空所有元素
find() //查找给定主键的位置,返回的是迭代器。常用的判断语句时:s.find(0) != s,end()
count() //返回值为int型,返回目标主键的个数。没找到就是0了

map

1.简要描述:map用于键值和数值对应。按照键值有序排列(从小到大)。相当于一维数组,键值为索引,数值为数组值(赋值时可以这么理解使用[],遍历时不使用[])可以理解为集合中有多个相同有序元素
2.头文件:#include< map>
3.定义格式:map<数据类型1,数据类型2> 变量名 // 例如:map<int, int> a;
4.常用函数:

insert() // 插入元素,成对儿插入。插入的方式有两种:{0,1},pair<int, int>(0,1)。后者更常用
erase() // 删除元素,删除有两种类型:迭代器删除或键值删除。键值删除,返回值是删除的个数。例如:num = s.erase(1)——删除键值为1的元素,并返回个数给num。迭代器删除,返回值是下一个位置的迭代器。例如:iter = s.erase(s.begin())。Iter指向第二个元素的迭代器
find() //查找给定主键的位置,返回的是迭代器。常用的判断语句时:s.find(0) != s,end()
clear() // 清空所有元素
count() //返回值为int型,返回目标主键的个数。没找到就是0了
empty() // 返回数组是否为空,不空返回false,空返回true
size() // 返回有效元素的个数
iter->first/iter->second // iter代表迭代器,first访问键值,second访问数值

  对于map/set,unorderedmap/unorderedset迭代器定义方式为如下:容器类名::iterator 迭代器名;
例如:
  unordered_set< int>::iterator a;
  set< int>::iterator a;
  unordered_map<int, string>::iterator a;
  map<int, string>::iterator a;

STL中一些比较常用的通用算法:

sort(a.begin(), a.end(), cmp)
头文件:#include< algorithm>
描述:功能是排序,前两个参数是迭代器,指定排序的范围。第三个是排序方式,缺省的话默认从小到达。自定义的话,返回值类型是staic bool cmp(int a, int b) {}

reverse(a.begin(), a,end())
头文件:#include< algorithm>
描述:功能是翻转,参数是两个迭代器。指定翻转范围

因本文作者水平有限,如有错误之处,请在下方评论区指正,谢谢!

猜你喜欢

转载自blog.csdn.net/gls_nuaa/article/details/114542691