C/C++学习笔记(十)标准模板库STL和string

来源:互联网 发布:极简装修 知乎 编辑:程序博客网 时间:2024/04/30 13:51

作为一个C++程序设计者,STL是一种不可忽视的技术。Standard Template Library (STL):标准模板库更准确的说是 C++ 程序设计语言标准模板库。STL是所有C++编译器和所有操作系统平台都支持的一种库,说它是一种库是因为,虽然STL是一种标准,也就是说对所有的编译器来说,提供给C++程序设计者的接口都是一样的。也就是说同一段STL代码在不同编译器和操作系统平台上运行的结果都是相同的,但是底层实现可以是不同的,如果要想研究的可以下载stl底层源码。 令人兴奋的是,STL的使用者并不需要了解它的底层实现。 试想一下,如果我们有一把能打开所有锁的钥匙,那将是多么令人疯狂啊。STL的目的是标准化组件,这样你就不用重新开发它们了。你可以仅仅使用这些现成的组件。STL现在是C++的一部分,因此不用额外安装什么。它被内建在你的编译器之内。STL是惠普实验室开发的一系列软件的统称。现在虽说它主要出现在C++中,是C++标准的一部分,而且关于这个库好几种不同的实现,微软也有自己的实现但在被引入C++之前该技术就已经存在了很长的一段时间。  

STL基本概念

STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了和模板类模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

1)算法是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。

2)容器是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。

3) 迭代器提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。
下面实例可以帮助理解算法、容器和容器,其中用到了容器类string,迭代器sIter,模板函数find。

#include "stdafx.h"#include <iostream>#include <string>int _tmain(int argc, _TCHAR* argv[]) {std::string s1;//string容器类    s1 = "hello";std::string::iterator sIter= find(s1.begin(),s1.end(),'l');//模板函数find 返回迭代器类型if(sIter!=s1.end()){std::cout<<*sIter<<std::endl;}else{std::cout<<"没有字符串e"<<std::endl;}getchar();return 0;  }

名字空间

你的编译器可能不能识别名字空间。名字空间就好像一个信封,将标志符封装在另一个名字中。标志符只在名字空间中存在,因而避免了和其他标志符冲突。例如,可能有其他库和程序模块定义了sort()函数,为了避免和STL地sort()算法冲突,STL的sort()以及其他标志符都封装在名字空间std中。STL的sort()算法编译为std::sort(),从而避免了名字冲突。和sort()一样,上面实例的find()的标识符也是封装在名字空间std中的。为了声明std命名空间里的标识符有效,使用时要加上std::xxx。声明使用命名空间标示符最省事方便的方法是:

using namespace std;
另外也可以具体指定某一些标识符:

using std::cout;using std::endl;
所以上面代码可以改为:

#include "stdafx.h"#include <iostream>#include <string>using namespace std;int _tmain(int argc, _TCHAR* argv[]) {string s1;    s1 = "hello";string::iterator sIter= find(s1.begin(),s1.end(),'l');if(sIter!=s1.end()){cout<<*sIter<<endl;}else{cout<<"没有字符串e"<<endl;}getchar();return 0;  }

string容器

string 其实相当于一个保存字符的序列容器,因此除了有字符串的一些常用操作以外,还有包含了所有的序列容器的操作。字符串的常用操作包括:增加、删除、修改、查找比较、链接、输入、输出等,,所以生成string类型要比C/C++学习笔记(二)中的字符数组简单多了。如果你要想了解所有函数的详细用法,你需要查看basic_string,或者下载STL编程手册。这里通过实例介绍一些常用函数。

string的构造函数

string既然是一个类,就有构造函数和析构函数。String类的构造函数和析构函数如下: 
a) string s; //生成一个空字符串s 
b) string s(str) //拷贝构造函数 生成str的复制品 
c) string s(str,stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值 
d) string s(str,stridx,strlen) //将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值 
e) string s(cstr) //将C字符串作为s的初值 
f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。 
g) string s(num,c) //生成一个字符串,包含num个c字符 
h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 
i) s.~string() //销毁所有字符,释放内存 
都很简单,也很全面,下面是几个常用的例子:

        string s1;string s2="hello s2";string s3("hello s3");string s4(4,'h');//以四个h字符构成的字符串string s5(s4);

string 操作符

string 重载了许多操作符,包括 +, +=, <, =, , [], <<, >>等,正式这些操作符,它的使用和int 或者float等一样简单,对字符串操作非常方便。如下面这个例子:

#include "stdafx.h"#include <string>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]) {string strinfo="Please input your name:";cout << strinfo ;cin >> strinfo;if( strinfo != "wende" )cout << "you are not wende!"<<endl;if( strinfo == "winter" )cout << "you are winter!"<<endl;else if( strinfo < "winter")cout << "your name should be ahead of winter"<<endl;elsecout << "your name should be after of winter"<<endl;string hello = strinfo+" , 欢迎来到中国!";cout << hello<<endl;cout <<"你名字的第一个字母是 :"<<endl;cout<<strinfo[0];cin >> strinfo;return 0;  }
运行结果:



string操作函数

string有很多操作函数,下面简单罗列一些常用的:

=,assign() //赋以新值 
swap() //交换两个字符串的内容 
+=,append(),push_back() //在尾部添加字符 
insert() //插入字符 
erase() //删除字符 
clear() //删除全部字符 
replace() //替换字符 
+ //串联字符串 
==,!=,<,<=,>,>=,compare() //比较字符串 
size(),length() //返回字符数量 
max_size() //返回字符的可能最大个数 
empty() //判断字符串是否为空 
capacity() //返回重新分配之前的字符容量 
reserve() //保留一定量内存以容纳一定数量的字符 
 [ ], at() //存取单一字符 
>>,getline() //从stream读取某值 
<< //将谋值写入stream 
copy() //将某值赋值为一个C_string 
c_str() //将内容以C_string返回 
data() //将内容以字符数组形式返回 
substr() //返回某个子字符串 
begin() end() //提供类似STL的迭代器支持 
rbegin() rend() //逆向迭代器 
get_allocator() //返回配置器