2024年2月3日 内容整理自《程序设计教程: 用C++语言编程 第三版》 陈家骏 郑滔
---------------------------------------------------------------------------------------------------------------------------------
C++标准模板库==STL==Standard Template Library
STL包含:
- 容器:同类元素长度可变的序列,用于储存数据,是类模板
- 算法:函数模板,用于操作数据
- 迭代器:用于访问容器中的元素,是抽象指针类模板
为了提高算法与容器之间的相互独立性,在STL中算法作用的参数不是容器,而是迭代器,在算法中通过迭代器来访问和遍历容器中的元素。迭代器起到了容器和算法之间的桥梁作用,它使得一个算法可以作用于多种容器,从而保证了算法的通用性。
---------------------------------------------------------------------------------------------------------------------------------
【例1】STL的vector容器中的一些操作示例
#include <iostream> #include <vector> #include <algorithm> #include <numeric> using namespace std; int main(){ vector<int> ve;//创建一个vector类容器对象ve,其中的元素为int型 int x; cin>>x; while(x>0){ ve.push_back(x);//往容器ve的尾部增加元素x cin>>x; } //创建容器ve的迭代器 vector<int>::iterator it1=ve.begin();//使迭代器it1指向ve的第一个位置 vector<int>::iterator it2=ve.end();//使迭代器it2指向ve的最后一个元素的下一个位置 //显然如下算法接受的参数都是迭代器 //调用算法“max_element”计算ve中的最大元素 cout<<"Max element in vector ve is:"<<*max_element(it1,it2)<<endl; //调用算法"accumulate"计算并输出容器ve中所有元素的和 cout<<"Sum in vector ve="<<accumulate(it1,it2,0)<<endl; //调用算法sort对容器ve中的元素进行排序 sort(it1,it2); cout<<"Sorted result is :\n"<; for_each(it1,it2,[](int x){ cout<<x<<' '; return; });//注意这个函数的第三个参数 // return 0; }
---------------------------------------------------------------------------------------------------------------------------------
//算法的#定义:
一般算法用#include <algorithm>
算数算法用#include <numeric>
---------------------------------------------------------------------------------------------------------------------------------
【例2】利用STL的map容器来实现一个电话号码薄
//2个月后刷LeetCode的时候遇到了!!!过来复习
#include <iostream> #include <map> #include <string> using namespace std; int main(){ map<string,int> phone_book;//T1为string,T2为int的模板map,实例化对象phone_book //往map里面添加信息 phone_book["wang"]=13209956788; phone_book["zeng"]=13594271400; phone_book["liu"]=15586994857; //输出电话号码薄 cout<<"电话号码薄的信息如下:\n"; map<string,int>::const_iterator it;//创建一个map的不能够修改所指向元素的迭代器 for(it=phone_book.begin();it!=phone_book.end();it++){//for循环遍历map类容器 cout<<"姓名:"<<it->first<<"电话:"<<it->second<<endl; }//for //查找某个人的电话号码 string name; cout<<"请输入要查询的姓名:"; cin>>name; it=phone_book.find(name); if(it==phone_book.end()) cout<<"Can't find name-"<<name; else cout<<"Found name--"<<it->first<<",His/Her number is:"<<it->second<<endl; return 0; }
我们可以使用Find()和Count()方法来发现一个键是否存在。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,
分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.
————————————————
-------------------------------------------
【例3】例用STL的容器list求解约瑟夫问题(****)
————————————————LetetCoder----
#include <string>
using namespace std;
int main()
{
std::string str="surpriseMotherfucker";
std::map<char,int> counter;
for(char c:str){
//遍历str中的所有字符,
//统计它们出现的次数并且储存到map容器中
//如果字符c出现的次数int,不等于map对象counter的最后一个成员
if(counter.find(c)!=counter.end()){
counter[c]++;
}else{
counter[c]=1;//仅出现1次
}
}
for(const auto& pair:counter){
std::cout<<"字符"<<pair.first<<"出现的次数为:"<<pair.second<<std::endl;
}
return 0;
}
//这是按照大小写和26字母表顺序给出的