stl是什么有什么
stl是什么
STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。
stl有什么
容器
verctor
vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。
list
list类似于c语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这也非常有利于数据的随机存取,因而它没有提供 [] 操作符重载。
deque
deque类似于C语言中的双向队列,即两端都可以插入或者删除的队列。queue支持 [] 操作符,也就是支持随机存取,而且跟vector的效率相差无几。它支持两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率
也差不多。或者我们可以这么认为,deque是vector跟list的折中。
map
map类似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,这种特性了使得map类似于数据结构里的红黑二叉树。
multimap
multimap类似于数据库中的1:N关系,它是一种关联容器,提供一对多的数据处理能力。
set
set类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。
multiset
multiset类似于数学里面的集合,集合中可以包含重复的元素。
以上内容引用了这里
C++中STL常用容器的区别 - 苍月代表我 - 博客园 (cnblogs.com)
算法
常用如sort,find,copy,for_each等
迭代器
扮演了容器和算法之间的胶合剂
仿函数
行为类似函数,可作为算法的某种策略
适配器
一种用来修饰容器或者迭代器接口的东西
空间适配器
负责空间的配置与管理
stl的简单实现
利用cevtor取反操作
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> v{ 1,2,3,4,5,6,7,8,9 };//简单定义一个
for (auto& i : v)//取反操作
i = -i;
for (auto i : v)//输出
cout << i << " ";
cout << endl;
for (auto& i : v) //平方操作
i *= i;
for (auto i : v)
cout << i << " ";
cout << endl;
return 0;
}
简单的set实现自定义类型操作
#include <iostream>
using namespace std;
#include<string>
#include<set>
class stu {//定义一个stu类
public:
stu(int xvhao, string name)
{
this->M_Xv = xvhao;
this->M_Na = name;
}
int M_Xv;
string M_Na;
};
class comparestu {//!!!!这步很重要,你自定义类型时,set并不知道怎么排序,所以我们要搞个仿函数告诉他
public:
bool operator()(const stu& s1, const stu& s2)const {
return s1.M_Xv < s2.M_Xv;//用学号排序,从小到大
}
};
void test() {
set<stu, comparestu>s;//定义一个set容器叫做s
stu s1(5026, "刘备");
stu s2(5030, "关羽");
stu s3(5028, "张飞");
stu s4(5027, "国灰");//我的标志特征数据
s.insert(s1);//简单输入一下
s.insert(s2);
s.insert(s3);
s.insert(s4);
for (set<stu, comparestu> ::iterator it = s.begin(); it != s.end(); it++)//输出一下
{
cout << "学号:" << it->M_Xv << "名字:" << it->M_Na << endl;
}
s.erase(s1);//删除操作
cout << "删除后" << endl;
for (set<stu, comparestu> ::iterator it = s.begin(); it != s.end(); it++)
{
cout << "学号:" << it->M_Xv << "名字:" << it->M_Na << endl;
}
set<stu, comparestu>::iterator iter;//查找操作
iter = s.find(s2);
cout << "查找结果为" << endl;
if (iter != s.end()) {
cout << (*iter).M_Xv << endl;
}
else {
cout << "Cannot fine the student!" << endl;
}
}
int main()
{
test();
system("pause");
return 0;
}
map实现输入一串字符串后输出个数
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main() {
string str;
map<char, int> map_s;
while (cin >> str) {
pair<map<char, int>::iterator, bool> ret;
for (int i = 0; i < str.length(); ++i) {
ret = map_s.insert(pair<char, int>(str[i], 1));
if (ret.second == false) {//如果插入失败,则该迭代器的第一个参数的value++
ret.first->second++;
}
}
map<char, int>::iterator iter = map_s.begin();
for (; iter != map_s.end(); iter++) {
cout << iter->first << ' ' << iter->second << endl;
}
cout << endl;
}
}
这个是应用了map表不能插入同一个数值的原理插入失败就加一,当然,很明显这不是我自己写的
总结
发现的问题
stl库的进展好像很慢,很多十年前的东西现在都可以用(没有革命性进展(好像),当然完整程度也很完整了),然后c++改语句也很迷,像2019const的修改。当然还是基础太差,在重载,引用和封装那块很吃力。努力课设做好点吧(估计也难)。