初识STL

105 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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:插入和删除频繁,随机访问较少。