C++高级,关于STL标准模板库

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个字符,返回修改后的字符串 

暂无评论

发表评论