C++模板库(STL)

C++模板库(STL),第1张

C++模板库(STL)

哈哈哈,今天新创立的账号,我深受安然影响,终于要开始更新博文了,也许我会写的很好吧,我相信自己,今天要更新的内容是我从一本名为《算法笔记》的书中摘取总结的,这本书还是挺有意思的,这本书相对于紫书来说,内容要易懂一些,我跟你说,这是我在准备算法编程竞赛中学习的,这肯定不是STL的全部,安然告诉我,这个知识解析,很适合编程竞赛了

目录

vector容器

1、vector概念及常见用法

vector定义

2、vector容器中的访问

2.1通过下标进行访问

2.2通过迭代器访问

3、vector的常用函数

3.1、push_back

3.2、pop_back

3.3、size()

3.4、clear

3.5、insert

3.6、erase

4、vector的构造函数

4.1、 vector v(n,elem)将n个元素拷贝给本身

4.2、 将v1中的v[begin(),end()]中的元素拷贝给本身

4.3、//拷贝构造函数,直接将v1中的元素拷贝到v4中

5、vector的容量和大小

6、vector数据存取

6.1、利用v.at()访问数据

6.2、front、back访问容器中元素

7、vector互换容器

string容器

1、string的定义

2、string的访问

2.1通过下标访问

2.2通过迭代器访问

3、string常用函数

3.1、operator+=

3.2、compare operator

3.3、length()和size()

3.4、insert()

3.5、erase和clear

3.6、substr()

3.7、find()和string::npos

3.8、replace

set容器/multiset容器

1、set的定义

2、set容器内元素的访问

3、set的常用函数

3.1、insert()

3.2、find(value)

3.3、erase

3.4、size()

3.5、clear()

map容器

1、map的定义

2、map容器内元素的访问

3、map的常用函数

queue和priority_queue容器

1、queue的定义

2、queue容器内元素的访问

3、queue的常用函数

3.1、push

3.2、front、back

3.3、pop

3.4、empty

3.5、size

priority_queue介绍

stack容器

1.stack的定义

2.stack容器内元素的访问

3.stack常用函数实例解析

3.1push

3.2、top

3.3、pop

3.4、empty

3.5size

algorithm

1、algorithm头文件下的常用函数

1.1、max()、min()和abs()

1.2、swap()

1.3、reverse()

1.4、next_permutation()

1.5、fill()

6.sort()


vector容器 1、vector概念及常见用法

vector翻译为向量,可以看做"变长数组",更容易理解,即“长度根据需要自动改变的数组”,可以动态扩展。

动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,将原数据拷贝到新空间,释放原空间

使用vector,需要添加vector的头文件,即#include.

vector定义

vector定义:vectorname;

和一维数组一样,这里的可以是任意基本类型,例如int,double,char、结构体等,也可以是STL标准容器,,例如vector,set,queue等。

在这里如果是一个STL容器的话,定义的时候要记得在>>符号之间加上空格。

下面分别是两种定义方式:

vector;//int可以替换为double,char,node等基本类型。

vector>v1;//>>之间要记得加空格

2、vector容器中的访问 2.1通过下标进行访问

和普通的数组一样,对一个定义为vector vi的vector容器来说,可以直接访问vi[0]-vi[size-1]中的任何一个元素。

当然,不能访问这个范围外的其他元素。

2.2通过迭代器访问

2.2.1、通过下标和指针访问数组的方式访问

 #include`
 using namespace std;
 #include`
 ​
 int main()
 {
     vectorv;
 for (int i = 0; i < 10; i++)
 {
     v.push_back(i);
 }
 vector::iterator it = v.begin();
 for (int i = 0; i < 10; i++)
 {
     cout << *(it + i)<<" ";
 }
 cout << endl;
 ​
     system("pause");
     return 0;
 ​
 }

输出结果:

0 1 2 3 4 5 6 7 8 9

//解释一下,这里的v.begin()是v的首元素地址,而it是指向这个地址后面还会经常用到v.end(),这里一并介绍了,end()取得是v的尾元素地址的下一个地址。end()是迭代器末尾标志。

2.2.2、通过找到迭代器末尾的方式访问

 #include
 using namespace std;
 #include
 ​
 int main()
 {
     vectorv;
     for (int i = 0; i < 10; i++)
     {
         v.push_back(i);
     }
     //vector的迭代器不支持it::iterator it = v.begin(); it != v.end(); it++)
     {
         cout << *it << " ";
 ​
     }
     cout << endl;
     system("pause");
     return 0;
 }

输出结果:

0 1 2 3 4 5 6 7 8 9

3、vector的常用函数 3.1、push_back

有学过数据结构的读者可能会知道,pushback顾名思义就是尾插,在vector的后面插入一个元素,时间复杂度为O(1)。

 #include
 using namespace std;
 #include
 ​
 int main()
 {
     vectorv;
     for (int i = 1; i <=10; i++)
     {
         v.push_back(i);//vector元素尾插
     }
     for (int i = 0; i < v.size(); i++)
     {
         cout << v[i]<<" ";
     }
     cout << endl;
     
     system("pause");
     return 0;
 }

输出结果:

1 2 3 4 5 6 7 8 9 10

3.2、pop_back

有插入就会有删除,pop_back用来删除vector中的尾元素,时间复杂度O(1)。

 #include
 using namespace std;
 #include
 ​
 int main()
 {
     vectorv;
     for (int i = 1; i <=10; i++)
     {
         v.push_back(i);//尾插
     }
     v.pop_back();//删除10
     v.pop_back();//删除9
     for (int i = 0; i < v.size(); i++)
     {
         cout << v[i]<<" ";
     }
     cout << endl;
     
     system("pause");
     return 0;
 }

输出结果:

1 2 3 4 5 6 7 8

3.3、size()

用来获的vectorz中的元素个数,时间复杂度为O(1)。一般来说,size()返回unsigned类型,不过用%d不会有大问题。

 #include
 using namespace std;
 #include
 ​
 int main()
 {
     vectorv;
     for (int i = 1; i <=10; i++)
     {
         v.push_back(i);
     }
 ​
     cout << "vector中的元素个数为:" << v.size() << endl;
     
     system("pause");
     return 0;
 ​
 }

输出结果:

vector中的元素个数为:10

3.4、clear

clear用来清空vector中的所有元素。

 #include
 using namespace std;
 #include
 ​
 int main()
 {
     vectorv;
     for (int i = 1; i <=10; i++)
     {
         v.push_back(i);
     }
     v.clear();
     cout << "vector中的元素个数为:" << v.size() << endl;
     
     system("pause");
     return 0;
 ​
 }

输出结果:

vector中的元素个数为:0

3.5、insert

insert(it,x)用来向vector中任意迭代器it处插入一个元素x,时间复杂度为O(N)。

 
#include
 using namespace std;
 #include
 int main()
 {
     vectorv;
     for (int i = 1; i <= 10; i++)
     {
         v.push_back(i);
     }
     for (int i = 0; i  

输出结果:

1 2 3 4 5 6 7 8 9 10

1 2 3 1000 4 5 6 7 8 9 10

3.6、erase

erase有两种用法:(一)删除单个元素(二)删除一个区间内的元素

(一)erase(it)

 #include
 using namespace std;
 #include
 int main()
 {
     vectorv;
     for (int i = 1; i <= 10; i++)
     {
         v.push_back(i);
     }
     for (int i = 0; i < v.size(); i++)
     {
         cout << v[i] << " ";
     }
     cout << endl;
     v.erase(v.begin() + 5);//删除的是  6 v.begin从数组0号位置开始
     for (int i = 0; i < v.size(); i++)
     {
         cout << v[i] << " ";
     }
 ​
     cout << endl;
     system("pause");
     return 0;
 }

输出结果:

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 7 8 9 10

(二)erase(first,last)

erase(first,last)就是删除[first,last)中的所有元素

 #include
 using namespace std;
 #include
 int main()
 {
     vectorv;
     for (int i = 1; i <= 10; i++)
     {
         v.push_back(i);
     }
     for (int i = 0; i < v.size(); i++)
     {
         cout << v[i] << " ";
     }
     cout << endl;
     v.erase(v.begin() +2 ,v.begin()+7);//清除一整行元素最方便的方法还是v.clear
     for (int i = 0; i < v.size(); i++)
     {
         cout << v[i] << " ";
     }
     cout << endl;
     system("pause");
     return 0;
 }

输出结果:

1 2 3 4 5 6 7 8 9 10

1 2 8 9 10

4、vector的构造函数
4.1、 vector v(n,elem)将n个元素拷贝给本身 4.2、 将v1中的v[begin(),end()]中的元素拷贝给本身 4.3、//拷贝构造函数,直接将v1中的元素拷贝到v4中
 
#include
 using namespace std;
 #include
 void print(vector&v)
 {
     for (vector::iterator it = v.begin(); it != v.end(); it++)//通过迭代器来访问元素
     {
         cout << *it << " ";
     }
     cout << endl;
 }
 int main()
 {
     vectorv1;//无参构造
     for (int i = 1; i <=10; i++)
     {
         v1.push_back(i);
     }
     print(v1);
     //vector v(n,elem)将n个元素拷贝给本身
     vector v2(5, 100);
     print(v2);
     //将v1中的v[begin(),end()]中的元素拷贝给本身
     vectorv3(v1.begin() + 3, v1.begin() + 7);
     print(v3);
     //拷贝构造函数
     //直接将v1中的元素拷贝到v4中
     vectorv4(v1);
     print(v4);
     system("pause");
     return 0;
 ​
 }

输出结果:

1 2 3 4 5 6 7 8 9 10

100 100 100 100 100 4 5 6 7

1 2 3 4 5 6 7 8 9 10

另外,用assign给vector进行赋值也是一个很好的选择。

 
#include
 using namespace std;
 #include
 void print(vector&v)
 {
     for (vector::iterator it = v.begin(); it != v.end(); it++)
     {
         cout << *it << " ";
     }
     cout << endl;
 }
 ​
 ​
 int main()
 {
 ​
     vectorv1;//无参构造
     for (int i = 1; i <=10; i++)
     {
         v1.push_back(i);
     }
     print(v1);
 //用法同上,将v[begin(),end()]的元素拷贝给自身
     vectorv2;
     v2.assign(v1.begin(), v1.end());
     print(v2);
 //将n个elem拷贝给自身
     vectorv3;
     v3.assign(5,100);
     print(v3);
     system("pause");
     return 0;
 ​
 }

输出结果:

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

100 100 100 100 100

5、vector的容量和大小

1、判断是否为空-----empty

2、返回元素个数-----size

3、返回容器容量-----capacity

4、重新指定大小-----resize

 #include
 using namespace std;
 #include
 void print(vector&v)
 {
     for (vector::iterator it = v.begin(); it != v.end(); it++)
     {
         cout << *it << " ";
     }
     cout << endl;
 }
 int main()
 {
     vectorv1;
     for(int i = 1; i <= 10; i++)
     {
         v1.push_back(i);
     }
     if (v1.empty())
     {
         cout << "v1为空" << endl;
     }
     else
     {
         cout << "v1不为空" << endl;
         cout << "v1的容量=" << v1.capacity() << endl;
         cout << "v1的大小=" << v1.size() << endl;
     }
     //resize重新指定大小,若指定的更大,默认用0填充位置
     //若指定的更小,超出部分元素被删除
     v1.resize(15, 10);
     print(v1);
     v1.resize(5);
     print(v1);
     system("pause");
     return 0;
 ​
 }

输出结果:

v1不为空 v1的容量=13

v1的大小=10

1 2 3 4 5 6 7 8 9

10 10 10 10 10 10

1 2 3 4 5

6、vector数据存取
6.1、利用v.at()访问数据
 
#include
 using namespace std;
 #include
 int main()
 {
     vectorv;
     for (int i = 1; i <= 10; i++)
     {
         v.push_back(i);
     }
     //利用v.at(i)访问数据
     for (int i = 0; i < v.size(); i++)
     {
         cout << v.at(i) << " ";
     }
     cout << endl;
     system("pause");
     return 0;
 ​
 }

输出结果:

1 2 3 4 5 6 7 8 9 10

6.2、front、back访问容器中元素

front返回容器中第一个元素

back返回容器中最后一个元素

#include
using namespace std;
#include
int main()
{
	vectorv;
	for (int i = 1; i <= 10; i++)
	{
		v.push_back(i);
	}
	//利用v.at(i)访问数据
	for (int i = 0; i < v.size(); i++)
	{
		cout << v.at(i) << " ";
	}
	cout << endl;
	cout << "容器中第一个元素是:" << v.front() << endl;

	cout << "容器中最后一个元素是:" << v.back() << endl;
	system("pause");
	return 0;

}

输出结果:

1 2 3 4 5 6 7 8 9 10

容器中第一个元素是:1

容器中最后一个元素是:10

7、vector互换容器

swap(vector)//将容器与本身的元素互换

 
#include
 using namespace std;
 #include
 void print(vector& v)
 {
     for (vector::iterator it = v.begin(); it != v.end(); it++)
     {
         cout << *it << " ";
     }
     cout << endl;
 }
 int main()
 {
     vectorv1;
     for (int i = 1; i <= 10; i++)
     {
         v1.push_back(i);
     }
     vectorv2;
     for (int i = 10; i > 0; i--)
     {
         v2.push_back(i);
     }
     cout << "互换前" << endl;
     print(v1);
     print(v2);
     cout << "互换后" << endl;
     v1.swap(v2);
     cout << "v1的值为" << endl;
     print(v1);
     cout << "v2的值为" << endl;
     print(v2);
 ​
     system("pause");
     return 0;
 ​
 }

输出结果:

互换前 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1

互换后 v1的值为 10 9 8 7 6 5 4 3 2 1

v2的值为 1 2 3 4 5 6 7 8 9 10

string容器

要使用string要加入string头文件,即#include

1、string的定义

string str;

2、string的访问
2.1通过下标访问

可以像字符数组一样访问string

 #include
 using namespace std;
 #include
 int main()
 {
     string str = "abcd";
     for (int i = 0; i < str.length(); i++)
     {
         cout<< str[i]<<" ";
     }
     cout << endl;
     system("pause");
     return 0;
 }

输出结果:

a b c d

还能够读入和输出整个字符串

 
#include
 using namespace std;
 #include
 int main()
 {
     string str;
     cout<<"输入的str为:";
     cin >> str;
     cout<<"输出的str为";
     cout << "str=" << str;
     cout << endl;
     system("pause");
     return 0;
 }

输出结果:

输入的str为:abcdefghi

输出的str为:str=abcdefghi

在C语言中,可以用c_str将string型str转换为字符数组进行输出

2.2通过迭代器访问

string迭代器并不像vector等容器那样还要有参数,可以直接定义

string::iterator it

可以直接通过*it访问string中的每一位

 #include
 using namespace std;
 #include
 int main()
 {
     string str = "abcd";
     for (string::iterator it = str.begin(); it != str.end(); it++)
     {
         cout << *it <<“ ”;
     }
     cout << endl;
     system("pause");
     return 0;
 }

string和vector一样,都可以进行str.begin()+elem的 *** 作,例如,str.begin()+3.

3、string常用函数
3.1、operator+=

可以直接将两个string拼接起来

 
#include
 using namespace std;
 #include
 int main()
 {
 ​
     string str1 = "abcd";
     string str2 = "efgh";
     str1 += str2;//直接将两个string拼接
     cout << "str1=" << str1;
 ​
 ​
     cout << endl;
     system("pause");
     return 0;
 }

输出结果:

str1=abcdefgh

3.2、compare operator

按照字典序的规则,两个string可以直接用==、!=、<、<=、>、>=比较大小

 #include
 using namespace std;
 #include
 int main()
 {
 ​
     string str1 = "abcd";
     string str2 = "efgh";
     string str3 = "abc";
     string str4 = "fghi";
     if (str1 < str2)
         cout << "str1= str2)
         cout << "str4>=str2" << endl;//如果str4>=str2,输出str4>=str2
 ​
     cout << endl;
     system("pause");
     return 0;
 }

输出结果:

str1

str1!=str3

str4>=str2

3.3、length()和size()

length和size基本相同,都是string长度

 #include
 using namespace std;
 #include
 int main()
 {
     string str1 = "abcd";
     string str2 = "efgh";
     str1 += str2;//直接将两个string拼接
     cout << "str1的长度为:"<< str1.length()< 

输出结果:

str1的长度为:8

str1的长度为:8

3.4、insert()

insert有很多写法:

3.4.1、insert(pos,string)

在pos位置插入字符串

 
#include
 using namespace std;
 #include
 int main()
 {
     string str1 = "abcd";
     cout << "str1=" << str1 << endl;
     str1.insert(3, "love");//在3号位置插入love字符串
     cout << "str1=" << str1 << endl;
 ​
     system("pause");
     return 0;
 }

输出结果:

str1=abcd

str1=abcloved

3.4.2、insert(it,it2,it3)

it为原字符要插入的位置,it2和it3为待插字符串的首尾迭代器,用来表示串[it2,it3)将被插在it的位置上

 
#include
 using namespace std;
 #include
 int main()
 {
     string str1 = "fall";
     string str2 = "in love";
     
     str1.insert(str1.begin() + 4, str2.begin(), str2.end());
     cout << "str1=" << str1 << endl;
 ​
     system("pause");
     return 0;
 }

输出结果:

str1=fallin love

3.5、erase和clear

erase和clear都是删除元素,erase可以删除指定区间内的元素,clear则是全部清空

str.earse(it)//删除单个元素

str.earse(first,last)//删除指定区间元素

str.earse(pos,length)//删除某一个位置后length长度的元素

 
#include
 using namespace std;
 #include
 int main()
 {
     string str1 = "abcdefgh";
     str1.erase(str1.begin() + 3);//删除下标为3的元素
     cout << "str1=" << str1 << endl;
 ​
     string str2 = "abcdefgh";
     str2.erase(str2.begin(), str2.begin() + 3);//删除从0号位到3号位的字符
     cout << "str2=" << str2 << endl;
 ​
     string str3 = "abcdefgh";
     str3.erase(0, 3);//删除从0号位开始的3个字符
     cout << "str3=" << str3 << endl;
     
     string str4 = "abcdefg";
     str4.clear();
     cout << "str4的长度为:" << str4.size() << endl;
     system("pause");
     return 0;
 }

输出结果:

str1=abcefgh

str2=defgh

str3=defgh

`str4的长度为:0

3.6、substr()

substr(pos,length)返回从pos位置开始,长度为length的子串,时间复杂度为O(len),相信大家有前面的基础,这里应该很容易理解

3.7、find()和string::npos

string::npos作为find函数失配时候的返回值,是一个unsigned_int类型,,等于-1或者4294967295

str1.find(str2)当str2是str1的子串的时候,返回str2在str1中第一次出现的位置,如果str2不是str1的子串,则返回string::npos

 #include
 using namespace std;
 #include
 int main()
 {
     string str1 = "Thank you for your smile";
     string str2 = "your";
     if (str1.find(str2) != string::npos)
     {
         cout << str1.find(str2) << endl;
     }
 ​
     system("pause");
     return 0;
 }

输出结果:

14

3.8、replace

str1.replace(pos,length,str2) str1的pos号位开始、长度为length的子串替换为str2

str1.replace(it1,it2,str2) str1的迭代器[it1,it2)范围的子串替换为str2

set容器/multiset容器

set容器是一个自动排序且不含重复元素的容器

set容器/multiset容器都属于关联式容器,底层结构是用二叉树实现

区别是set内不能有重复元素,multiset可以有重复元素

1、set的定义

使用set的时候,需要添加set头文件,即#include

setname;

和vector一样,如果typename是一个容器,假的在定义的时候在>>符号之间加入空格

即set >st;//中间要加入空格

2、set容器内元素的访问

set只能通过迭代器iterator访问

 
#include
 using namespace std;
 #include
 int main()
 {
     setst;
     st.insert(3);//insert(x)将x插入到set中
     st.insert(5);
     st.insert(2);
     st.insert(3);
     for (set::iterator it = st.begin(); it != st.end(); it++)
     {
         cout << *it << " ";
     }
     cout << endl;
     return 0;
 }

输出结果:

2 3 5

3、set的常用函数 3.1、insert()

将x插入到set容器中,并自动排序和去重,使用情况请看set容器内元素的访问

3.2、find(value)

找到对应值为value的迭代器

 
#include
 using namespace std;
 #include
 int main()
 {
     setst;
     for (int i = 1; i <= 9; i++)
     {
         st.insert(i);
     }
     set::iterator it = st.find(4);
     cout << *(st.find(4)) << endl;//打印迭代器中4
     system("pause");
     return 0;
 }
3.3、erase

erase有两种用法,

1、删除单个元素

2、删除一个区间内的所有元素

3.3.1、erase(it)

与vector的相似,不过多赘述

3.3.2、erase(first,last)

与vector的相似,不过多赘述

3.4、size()

size()用来获得set内元素的个数

 #include
 using namespace std;
 #include
 int main()
 {
     setst;
     for (int i = 1; i <= 9; i++)
     {
         st.insert(i);
     }
     cout << "set容器内元素的个数:" << st.size() << endl;
 ​
 ​
     system("pause");
     return 0;
 }

输出结果:

set容器内元素的个数:9

3.5、clear()

清除set内的所有元素

map容器

map可以将任何基本类型映射到任何基本类型,包括STL容器

使用map时,需要添加map的头文件,即#include

1、map的定义

mapmp;

其中typename1是键key,typename2对应映射后的类型value值

如果是字符串到整型的映射,必须使用string而不能用char数组,因为char数组作为数组,是不能作为键值的

2、map容器内元素的访问

2.1通过下标访问

map中键的值是唯一的

 #include
 using namespace std;
 #include
 int main()
 {
     mapmp;
     mp['c']=10;
     mp['c']=20;//此时10会被覆盖
     cout< 

输出结果:

20

2.2通过迭代器访问

map迭代器是这样定义的

map::iterator it;

map使用it->first来访问键,it->second来访问值,另外啊,map中访问出来的数值会按从小到大的顺序自动排序,是不是想到了之前的set容器呢?

 
#include
 using namespace std;
 #include
 int main()
 {
     map mp;
     mp['m'] = 20;
     mp['r'] = 30;
     mp['a']= 40;
     for(map::iterator it = mp.begin(); it != mp.end(); it++)
     {
         cout << it->first <<" " << it->second << endl;
     }
     return 0;
 }

输出结果:

a 40

m 20

r 30

3、map的常用函数

3.1、find()

find返回键为key的映射的迭代器

 
#include
 using namespace std;
 #include
 int main()
 {
     mapmp;
     mp['m'] = 1;
     mp['r'] = 2;
     mp['a'] = 3;
     map::iterator it = mp.find('r');
     cout << it->first << " " << it->second << endl;
     system("pause");
     return 0;
 ​
 }

输出结果:

r 2

3.2、erase()

3.2.1、mp.erase(it)

删除单个元素

 
#include
 using namespace std;
 #include
 int main()
 {
     mapmp;
     mp['m'] = 1;
     mp['r'] = 2;
     mp['a'] = 3;
     mp.erase('r');
     for (map::iterator it = mp.begin(); it != mp.end(); it++)
     {
         cout << it->first << " " << it->second << endl;
     }
     system("pause");
     return 0;
 ​
 }

输出结果:

a 3

m 1 

删除一个区间内的所有元素

 #include
 using namespace std;
 #include
 int main()
 {
     mapmp;
     mp['e'] = 8;
     mp['a'] = 7;
     mp['b'] = 6;
     mp['c'] = 5;
     mp['d'] = 4;
     mp['f'] = 3;
     map::iterator it = mp.find('e');
     mp.erase(it, mp.end());
     for(map::iterator it = mp.begin(); it != mp.end(); it++)
     {
         cout << it->first << " " << it->second << endl;
     }
     system("pause");
     return 0;
 }

输出结果:

a 7

b 6

c 5

d 4

3.3、size()

用来获得映射的个数

 #include
 using namespace std;
 #include
 int main()
 {
     mapmp;
     mp['e'] = 8;
     mp['a'] = 7;
     mp['b'] = 6;
     mp['c'] = 5;
     mp['d'] = 4;
     mp['f'] = 3;
     cout << mp.size() << endl;
     system("pause");
     return 0;
 }

输出结果:

6

3.4、clear()

用来清空map中的所有元素

queue和priority_queue容器

queue是队列priority_queue是优先队列

1、queue的定义

要使用queue要先添加queue头文件#include

queuename;

2、queue容器内元素的访问

queue容器只能通过front来访问队首元素,用back来访问队尾元素

 #include
 using namespace std;
 #include
 int main()
 {
     queueq;
     for (int i = 1; i <= 8; i++)
     {
         q.push(i);
     }
     cout << q.front() << " " << q.back() << endl;
     system("pause");
     return 0;
 }

输出结果: 1 8

3、queue的常用函数 3.1、push 3.2、front、back 3.3、pop

pop可以让元素出队

 #include
 using namespace std;
 #include
 int main()
 {
     queueq;
     for (int i = 1; i <= 8; i++)
     {
         q.push(i);
     }
     cout << q.front() << " " << q.back() << endl;
     for (int i = 1; i < 3; i++)
     {
         q.pop();
     }
     cout << q.front() << " " << q.back() << endl;
     system("pause");
     return 0;
 }

输出结果:

1 8

`3 8

3.4、empty

empty检测queue是否为空,返回ture则为空

返回false则非空

3.5、size

用来返回queue中元素的个数

priority_queue介绍

priority_queue需要引入的头文件一样,因为priority中没有front和back函数,只能通过top函数来访问队列

stack容器 1.stack的定义

要使用stack,应先添加头文件#include, 并在头文件下面加上" using namespace std;",然后就可以使用了。

其定义的写法和其他STL容器相同,typename可以是任意基本数据类型或容器:

2.stack容器内元素的访问

由于栈(stack) 本身就是一种先进后出的数据结构,在STL的stack 中只能通过top() 来访问栈顶元素

示例如下:

#include #include

using namespace std;

int main() { stack st; for (int i = 1; i <= 5; i++) { st.push(i);//依次入栈1 2 3 4 5 } printf("%dn", st.top());//输出5 return 0; }

3.stack常用函数实例解析 3.1push

(1).push() push(x) 将x 入栈,时间复杂度为O(1),

3.2、top

top()获得栈顶元素,时间复杂度为O(1)

3.3、pop

pop()用以d出栈顶元素,时间复杂度为O(1)

示例如下:

 #include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     stack st;
     for (int i = 1; i <= 5; i++)
     {
         st.push(i);
     }
     for (int i = 0; i < 3; i++)
     {
         st.pop();
     }
     printf("%dn", st.top());//输出2
     return 0;
 }

3.4、empty

empty()可以检测stack 内是否为空,返回true 为空,返回false 为非空,时间复杂度为O(1)

3.5size

size()返回stack 内元素的个数,时间复杂度为O(1)

algorithm 1、algorithm头文件下的常用函数

使用algorithm 头文件,需要在头文件下面加上一行"using namespace std;",才能正常使用

max()、min()、abs() swap() reverse() next_permutation() fill() sort() lower_bound() 和 upper_bound()

1.1、max()、min()和abs()

max(x,y)和min(x,y) 分别返回x, y中的最大值和最小值,且参数必须是两个,可以是浮点数,如果想返回三个数x,y,z的最大值,可以使用max(x, max(y, z)) 的写法;abs(x) 返回x的绝对值。注意:此时的x 必须是整数,浮点数的绝对值请用math 头文件下的fabs

示例如下:

 #include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     int x = -1;
     int y = -2;
     printf("%d %dn", max(x, y), min(x, y));//输出-1 -2
     printf("%d %dn", abs(x), abs(y));//输出1 2
     return 0;
 }
1.2、swap()

swap(x, y) 用来交换x 和 y 的值

 #include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     int x = 10;
     int y = 20;
     swap(x, y);
     printf("%d %dn", x, y);//输出20 10
     return 0;
 }
 
1.3、reverse() 

reverse(it, it2) 可以将数组指针在[it, it2) 之间的元素或容器的迭代器在[it, it2) 范围内的元素进行反转

 #include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     int arr[10] = { 10,11,12,13,14,15 };
     reverse(arr, arr + 4);//将arr[0]~arr[3]反转
     for (int i = 0; i < 6; i++)
     {
         printf("%d ", arr[i]);//输出13,12,11,10,14,15
     }
 ​
     return 0;
 ​
 }
 ​

如果要是对容器中的元素(例如string 字符串)进行反转,结果也是一样

 #include
 #include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     string str = "abcdefghi";
     reverse(str.begin() + 2, str.begin() + 6);//对str[0]~str[5]反转
     for (int i = 0; i < str.length(); i++)
     {
         printf("%c", str[i]);//输出abfedcghi
     }
     return 0;
 }
 
1.4、next_permutation() 

next_permutation() 给出一个序列在全排列中得下一个序列

例如,当n == 3 时的全排列为:

123

132

213

231

312

321

这样231的下一个序列就是312

示例如下:

 
#include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     int a[10] = { 1,2,3 };
     //a[0]~a[2]之间的序列需要求解next_permutation
     do
     {
         printf("%d%d%dn", a[0], a[1], a[2]);
     } while (next_permutation(a, a + 3));
     return 0;
 }

在上述的代码中,使用循环是因为next_permutation在已经到达全排列的最后一个时会返回false, 这样会方便退出循环。而使用do...while语句而不使用while语句是因为序列1 2 3本身也需要输出,如果使用while会直接跳到下一个序列再输出,这样的话结果会少一个123

1.5、fill()

fill()可以把数组或容器中的某一段区间赋为某个相同的值。和memset 不同,这里的赋值可以是数组类型对应范围中的任意值

#include
 #include

using namespace std;

int main()
 { 

int a[5] = { 1,2,3,4,5 };

fill(a, a + 5, 133);//将a[0]~a[4]均赋值为133

for (int i = 0; i < 5; i++) {

 printf("%d ", a[i]);//输出133 133 133 133 133 } return 0;
 }

6.sort()

顾名思义,sort()就是用来排序的函数,它根据具体情形使用不同的排序方法,效率较高。一般来说,不推荐使用C语言中的qsort函数,原因是qsort 用起来比较繁琐,涉及很多指针的 *** 作。

如何使用sort排序? sort函数的使用必须加上头文件"#include" 和 "using namespace std;",其使用的方式如下:

sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));

可以看到,sort的参数有三个,其中前两个是必填的,而比较函数则可以根据需要填写,如果不写比较函数,则默认对前面给出的区间进行递增排序。

示例如下:

 #include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     int a[6] = { 9,4,2,5,6,-1 };
     //将a[0]~a[3]进行从小到大排序
     sort(a, a + 4);
     for (int i = 0; i < 6; i++)
     {
         printf("%d ", a[i]);//输出2 4 5 9 6 -1
     }
     putchar('n');
     //将a[0]~a[5]进行从小到大排序
     sort(a, a + 6);
     for (int i = 0; i < 6; i++)
     {
         printf("%d ", a[i]);//输出-1 2 4 5 6 9
     }
     return 0;
 }

对double数组进行排序:

 #include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     double a[] = { 1.4,-2.1,9 };
     sort(a, a + 3);
     for (int i = 0; i < 3; i++)
     {
         printf("%.1lf ", a[i]);
     }
     return 0;
 }

对char型数组进行排序(默认是字典序)

 
#include
 #include
 ​
 using namespace std;
 ​
 int main()
 {
     char c[] = { 'T', 'W','A', 'K' };
     sort(c, c + 4);
     for (int i = 0; i < 4; i++)
     {
         printf("%c", c[i]);//输出AKTW
     }
     return 0;
 }

我们需要知道的是,如果对序列进行排序,那么序列中的元素一定要有可比性,因此需要制定排序规则来建立这种可比性。特别是像结构体,本身并没有大小关系,需要认为制定比较的规则。sort 的第三个可选参数就是cmp函数,用来实现这个规则。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5691686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存