1.关于什么事STL就不在这里累述了,不了解的可以去百度一下
整个软件领域里,数十年来确实都在为了一个目标而奋斗—可复用性
从最早的面向过程的函数库,到面向对象的程序设计思想,到各种组件 技术(如:COM、EJB),到设计模式(design pattern)等等。而STL也在 做着类似的事情,同时在它背后蕴涵着一种新的程序设计思想–泛型化设计 (generic programming)。
STL的基本概念
STL的代码可以在广义上分为三类:
container(容器)
iterator(迭代器)
algorithm(算法)
容器即是数据结构中的结构,如队列,栈等; 容器和算法通过迭代器可以进行无缝地连接。
注意:string也是STL的一部分。
使用STL的好处 :
1)STL是C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
2)STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但 是这种分离确实使得STL变得非常通用。
3) 程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就OK 了。这样他们就可以把精力放在程序开发的别的方面。
4) STL具有高可重用性,高性能,高移植性,跨平台的优点。
5) 程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就OK 了。这样他们就可以把精力放在程序开发的别的方面。
6) 了解到STL的这些好处,我们知道STL无疑是最值得C++程序员骄傲的一部 分。每一个C++程序员都应该好好学习STL。只有能够熟练使用STL的程序员, 才是好的C++程序员。
总之:招聘工作中,经常遇到C++程序员对STL不是非常了解。大多是有 一个大致的映像,而对于在什么情况下应该使用哪个容器和算法都感到比较茫 然。STL是C++程序员的一项不可或缺的基本技能,掌握它对提升C++编程大有 裨益。
光说不练假把式,下面就来写写代码:
#include <iostream> #include <vector> using namespace std; int main(void) { //创建⼀一个STL数组容器 vector<int> zploo; // 向容器v中添加⼀一些 数据 //vector: push_back() 是想vector容器后⾯面添加元素 zploo.push_back(1); zploo.push_back(2); zploo.push_back(3); zploo.push_back(3); // 此时的zploo容器内容: [1 2 3 3] return 0; }
咱们就来详细说说容器,那么容器都分为哪几类了?
容器分为:序列式容器和关联式容器。
序列式容器(Sequence containers)
每个元素都有固定位置,取决于插入时机和地点,和元素值无关。 vector、deque、list
关联式容器(Associated containers)
元素位置取决于特定的排序准则,和插入顺序无关 set、multiset、map、multimap
string容器
string是STL的字符串类型,通常用来表示字符串。而在使用string之前字符串通常使用 chai* 表示的。 那么二者有什么区别呢
- 1.string是一个类,char*是一个指向字符的指针(string其实就是一个char*型的容器,他封装饿char*,来管理字符)
- 2.使用string不用考虑内存的释放和越界(string管理char*所分配的内存。每一次string的复制,取值都由 string类负责维护,不用担心复制越界和取值越界等
- 3.string提供了一系列的字符串操作函数(例如:查找find(),拷贝copy(),删除erase(),替换replace(),插入 insert()
值得注意string类的字符操作时 operator[] 和 at()的区别:
主要区别:at()在越界时会抛出异常,operator[]在刚好越界时会返回 (char)0,再继续越界时,编译器直接出错。如果你的程序希望可以通过try,catch 捕获异常,建议采用at()。
string &operator+=(const string &s); //把字符串s连接到当前字符串结尾 string &operator+=(const char *s); //把字符串s连接到当前字符串结尾 string &append(const char *s); //把字符串s连接到当前字符串结尾 string &append(const char *s,int n); //把字符串s的前n个字符连接到当前字符串结尾 string &append(const string &s); //同operator+=() string &append(const string &s,int pos, int n); //把字符串s中从pos开始的n个字符连接到当前字符串结尾 string &append(int n, char c); //在当前字符串结尾添加n个字符c
string的比较
/* compare函数在>时返回 1,<时返回 -1,==时返回 0。 比较区分大小写,比较时参考字典顺序,排越前面的越小。 大写的A⽐⼩写的a⼩。 */ int compare(const string &s) const; //与字符串s⽐比较 int compare(const char *s) const; //与字符串s⽐比较
string的查找和替换
/*查找*/ int find(char c,int pos=0) const; //从pos开始查找字符c在当前字符串的位置 int find(const char *s, int pos=0) const; //从pos开始查找字符串s在当前字符串的位置 int find(const string &s, int pos=0) const; //从pos开始查找字符串s在当前字符串中的位置 //注意:find函数如果查找不到,就返回-1 int rfind(char c, int pos=npos) const; //从pos开始从后向前查找字符c在当前字符串 中的位置 int rfind(const char *s, int pos=npos) const; int rfind(const string &s, int pos=npos) const; //注意: rfind是反向查找的意思,如果查找不到, 返回-1 /*替换*/ string &replace(int pos, int n, const char *s); //删除从pos开始的n个字符,然后在pos处插⼊入串s string &replace(int pos, int n, const string &s); //删除从pos开始的n个字符,然后在pos处插⼊入串 s void swap(string &s2); //交换当前字符串与s2的值
string的区间删除和插入
/*插⼊*/ string &insert(int pos, const char *s); //在pos位置插⼊入字符串s string &insert(int pos, const string &s); //在pos位置插⼊入字符串s string &insert(int pos, int n, char c); //在pos位置 插⼊入n个字符c /*删除*/ string &erase(int pos=0, int n=npos); //删除pos开始的n个字符,返回修改后的字符串