持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
初始STL
STL是指C++的标准模板库(Standard Template Library )。它很好用,但也很复杂。
容器
1、vector
vector就是一个不定长数组。不仅如此,它把一些常用操作“封装”在了vector类型内部。例如,若a是一个vector ,可以用a.size()读取它的大小,a.resize()改变大小,a.push_back()向尾部添加元素,a.pop_back()删除最后一个元素。
vector是一个模板类﹐所以需要用vector<int>a或者vector<double>b这样的方式来声明一个vector。Vector<int>是一个类似于int a[]的整数数组,而vector<string>就是一个类似于string a[]的字符串数组。
vector之间可以直接赋值或者作为函数的返回值,像是"一等公民”一样。
vector<int> b(a); //用a定义b
vector<int> a(100); //a有100个值为0的元素
vector<int> a(100, 6) //a有100个值为6的元素
vector<string> a(10, "hello");
vector<string> b(a.begin(), a.end()); // b是a的复制
a.insert(a.begin() + i, k); // 在第i个元素前插入k
a.erase(a.begin() + i, a.bejin() + j); //删除区间[i, j - 1]的元素
a.erase(a.begin() + 2); // 删除第三个元素
reverse(a.begin(), a.end()); //翻转数组
vector 是STL的动态数组,索引可以在常数时间内完成,插入或删除中间某一项需要线性时间,时间复杂度是O(n).
2、set
set 就是集合。STL的set用二叉搜索树实现,集合中的每一个元素只出现一次,并且是排好序的。访问元素的时间复杂度是O(logn) 非常高效。
a.insert(item); //插入
a.erase(item); //删除
a.find(k); //返回一个迭代器,指向k
a.lower_bound(); // 返回一个迭代器,指向键值不小于k的第一个元素
a.upper_bound(); // 返回一个迭代器,指向键值大于k的第一个元素
set头文件中的set和map头文件中的map分别是集合与映射。二者都支持 insert、find、count和remove操作,并且可以按照从小到大的顺序循环遍历其中的元素。 map还提供了“[]”运算符,使得map可以像数组一样使用。事实上,map也称为“关联数组”。
3、栈、队列
STL还提供了数据结构:栈、队列。所谓栈,就是符合“后进先 出”(Last In First Out,LIFO)规则的数据结构,有PUSH和POP两种操作,其中PUSH把元素 压入“栈顶”,而POP从栈顶把元素“弹出”。
STL的stack头文件提供了栈,用"stack<int>s"方式定义,用push()和pop()实现元素的入栈和出栈操作﹐top()取栈顶元素(但不删除)。
栈需要空间存储,如果深度太大,或者存储进栈的数组太大,那么总数会超过系统为栈分配的空间,这样就会爆栈,即栈溢出。
队列是符合“先进先出”( First In First Out , FIFO )原则的“公平队列”。
4、list
list是数据结构的双向链表,它的内存空间可以是不连续的,通过指针进行数据的访问,它可以高效的在任意地方删除和插入,插入和删除操做是常数时间的。
list 和 vector 的优缺点正好相反,它们的应用场景不同。
(1)vector:插入和删除次数较少,随机访问元素频繁。
(2)list:插入和删除频繁,随机访问较少。