STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。
stl有什么 verctorvector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] *** 作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。
listlist类似于c语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这也非常有利于数据的随机存取,因而它没有提供 [] *** 作符重载。
dequedeque类似于C语言中的双向队列,即两端都可以插入或者删除的队列。queue支持 [] *** 作符,也就是支持随机存取,而且跟vector的效率相差无几。它支持两端的 *** 作:push_back,push_front,pop_back,pop_front等,并且在两端 *** 作上与list的效率
也差不多。或者我们可以这么认为,deque是vector跟list的折中。
map类似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,这种特性了使得map类似于数据结构里的红黑二叉树。
multimapmultimap类似于数据库中的1:N关系,它是一种关联容器,提供一对多的数据处理能力。
setset类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。
multisetmultiset类似于数学里面的集合,集合中可以包含重复的元素。
以上内容引用了这里
C++中STL常用容器的区别 - 苍月代表我 - 博客园 (cnblogs.com)
算法
常用如sort,find,copy,for_each等
迭代器
扮演了容器和算法之间的胶合剂
仿函数
行为类似函数,可作为算法的某种策略
适配器
一种用来修饰容器或者迭代器接口的东西
空间适配器
负责空间的配置与管理
stl的简单实现利用cevtor取反 *** 作
#include#include using namespace std; int main() { vector 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实现自定义类型 *** 作
#includeusing namespace std; #include #include 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 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 ::iterator it = s.begin(); it != s.end(); it++)//输出一下 { cout << "学号:" << it->M_Xv << "名字:" << it->M_Na << endl; } s.erase(s1);//删除操作 cout << "删除后" << endl; for (set ::iterator it = s.begin(); it != s.end(); it++) { cout << "学号:" << it->M_Xv << "名字:" << it->M_Na << endl; } set ::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#include #include
这个是应用了map表不能插入同一个数值的原理插入失败就加一,当然,很明显这不是我自己写的
总结 发现的问题
stl库的进展好像很慢,很多十年前的东西现在都可以用(没有革命性进展(好像),当然完整程度也很完整了),然后c++改语句也很迷,像2019const的修改。当然还是基础太差,在重载,引用和封装那块很吃力。努力课设做好点吧(估计也难)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)