ZC:这里视频里面有一个调试小技巧,VS08/VS2010开始,控制台程序会自动退出(不像VC6),那么可以在 函数退出的最后一句语句上设置断点,然后查看控制台打印出来的信息。
ZC:这一讲,给我的感觉是,用string的好处就是 字符串操作时 索引越界的事情可以不用考虑了(如 复制/删除 等操作)
【01:05】这一讲,主要讲解如下要点:
一、什么事STL,使用STL的好处;
二、STL的string类型的使用方法。
【01:25】STL的简介
标准模板库
【01:45】STL的代码,广义上来讲,分为3类:容器、迭代器、算法。容器 和 算法 可以通过 迭代器 进行无缝的连接。
【02:02】string 和 wstring 也是STL的一部分
【02:28】STL的组成和内部关系
【03:05】STL的好处
【03:12】概括的说一下,什么叫容器
【04:35】STL的一个重要特点
数据结构(容器)和算法的分离 ==> 重用率很高。我这个排序算法,既可以用于 list容器 也可以用于其他的容器。
【05:55】比如 STL里面有一个 sort(...)排序函数,我们可以用来操作vector、list这样的容器
【06:15】STL具有高度的可重用性、高性能、跨平台 的优点
【06:27】使用STL的好处
01_02_使用STL的好处.jpg
(1)、【06:28】高可重用性
(2)、【07:50】高性能
01_03_使用STL的好处.jpg
(3)、【08:24】高移植性
(4)、【08:52】跨平台
【09:20】STL的其他好处:程序员不用思考STL的实现过程,只要能够熟练的掌握STL就可以了。可以将精力放在业务逻辑上。
【10:40】string
string是什么、string和char*的比较、如何调用STL的string,往后会讲到 string的构造函数、如何取字符(串)、如何取得 const char *(里面的操作)、如何拷贝char*指向的空间。
我们会讲到string 怎么取它的长度,如何知道这个string里面包含了多少个字符,string如何赋值,string两个字符串如何连接、如何比较、如何取string串里面的子串,如何查找、如何插入、如何删除、如何替换,和wstring的区别,string 和 wstring 的转换,string编码的统一化。
【12:11】string是什么
01_04_string是什么.jpg
【12:30】string 和 char* 的区别:
首先,string 是一个类,char* 是一个指向字符(ZC:串?)的指针,string封装了 char* ,管理字符串,是一个 char*类型的容器。
【12:45】string不用考虑内存释放和越界的问题。string管理了char*所分配的内存,每一次string的复制、取值 都是由string类来负责维护的,不用担心 复制越界 和 取值越界 这样的问题。
【13:05】string支持运算。比如 两个字符串连接。
【13:22】string还提供了一系列的字符串操作函数。如 查找、拷贝、删除、替换、插入 等等。
【13:31】我们如何使用string。使用它之前,首先要在我们的代码的文件里面(头文件里面/cpp文件里面),先要写一行代码:
“
#include <string>
using namespace std;
”
这样写的好处:防止我们的这个string 跟 程序其它部分定义的string 重名,(当然我们最好注意 不要重名)。
【14:15】“using namespace std;”是STL相对标准的一种写法,它目的是为了定义一个命名空间。
【14:28】string的构造函数
01_05_string的构造函数.jpg
【14:32】构造函数 一般有 默认构造函数、拷贝构造函数、带参数的构造函数。
【17:22】取string(字符串)中的某一个字符
两种:[?] 和 at(?)
【18:43】01_06_string的取字符操作.jpg
【19:25】[?] 和 at(?) 的唯一区别:这两个方法对越界的处理是不一样的
【19:45】例如,我们取第50个字符(这里没有50个字符):【20:03】用“[?]”来取,程序就会读地址错,就会越界。STL对 [?] 是没有做越界判断的,∴它直接会导致程序的crash。【20:20】对“at(?)”来说,它是不会产生crash问题的,它会抛出一个异常,超出范围的异常(out_of_range),该异常能够被“try{}catch(...){}”捕获到,这个时候 catch(???)里面就可以写上特定的 错误捕获的类型。
【21:32】我们看到取字符
“
const char &operator[](int n) const;
const char &at(int n) const;
char &operator[](int n);
char &at(int n);
”
上面“const char &”和 直接“char &” 有何区别?
【21:40】当我们要获取某一个 字符 的时候,实际上调用的是 返回"const char &" 的对应的两个函数。
【21:55】如果我们想要修改 某一个位置上的字符的值的话,ZC:调用的就是 返回"char &" 的对应的两个函数。【22:30】【22:35】为什么不是const?∵说明里面的值可以被修改。
【22:50】string如何取得 "const char*" 里面的操作。
意思是说:我们有时候想要把我们的string里面的内容打印出来,打印到屏幕上去。
【23:22】一般都是采用“cout << ?? <<endl;”,但是它不接受string,接受char*。
【24:00】string::c_str() 返回“const char*”
【25:15】如何把string 字符串里面的内容拷贝到 char*所指向的内存空间去
【25:32】把string拷贝到char*指向的内存空间的操作
01_07_把string拷贝到pchar指向的内存空间的操作.jpg
int copy(char *s, int n, int pos=0) const;
ZC: 注意参数 个数 在前,起始位置 在后
ZC: 注意是 string::copy(...),不要和 Delphi里面的copy函数搞一起搞混了...
【29:30】如何取得字符串的长度,如何判断字符串是否为空
当然,字符串长度==0,肯定是为空。字符串长度==0,可能有时候还不是很方便,用 bool string::empty() const;
【29:50】01_08_string的长度.jpg
【30:13】01_09_string的赋值.jpg
【30:28】1、=:const string& ==> string&
【31:23】2、string &string::assign(const char *s); // s的 所有字符
【31:31】3、string &string::assign(const char *s, int n); // s的 前n个字符
【31:52】01_10_string的赋值.jpg
【31:55】4、string &string::assign(const string &s); // 类似于 operator=
【32:08】5、string &string::assign(int n, char c); // 类似于构造函数里面的相应函数。n个相同的字符c ==> string&
【32:30】6、string &string::assign(const string &s, int start, int n);
【32:36】字符换的连接
【34:28】01_11_string的连接.jpg
【33:01】1、+=
【33:19】之前准备的例子
(1)、+= const string &
(2)、+= const char *
【35:15】2、string::append(...)
(1)、const char *
(2)、const char *, int n
【37:03】01_12_string的连接.jpg
(3)、const string & // 同 +=
(4)、const string &s, int pos, int n
(5)、int n, char c
【40:30】string 字符串的比较
01_13_string的比较.jpg
“
int string::compare(const string &s) const;
int string::compare(const char *s) const;
大于 --> 返回 1
小于 --> 返回 -1
等于 --> 返回 0
ASCII 码表 字典顺序,排越前越小
”
【41:49】比较 的例子
【42:31】字符是一个一个来比较的,一旦得出胜负,比较久结束了,直接返回值了
【44:02】如何取得string的子字符串
【44:15】01_14_string的子串.jpg
string string::substr(int pos=0, int n=npos) const; // 返回由pos开始的n个字符组成的子字符串
ZC:后面一个参数的默认值含义,应该是从pos往后的所有字符吧?测试下来,确实是这样。
【15:20】string的查找
【45:56】有两个方向的查找
【46:30】例如 找文件扩展名,从后往前比较好 ==> string::rfind(...)
【46:55】01_15_string的查找.jpg
【47:18】string的查找 例子
(1)、找字符
(2)、找 const char* 字符串
【49:05】ZC: 这里的例子,我和视频作者都觉得应该返回的是3(待查找字符串的开始位置),但是返回的却是5(待查找字符串的结束位置)
【50:18】ZC: 找到原因了,确实应该是3,居然是 ∵字符串用单引号括起来,但是居然能编译的过去...测试了一下,真编译的过去,Why?
(3)、找 const string& 字符串
(4)、string::find(...) 找不到,则返回 -1
【51:45】反向访问(01_16_string的查找(反向).jpg)
ZC: 测试一下,看看第二个参数的含义(是正着数的索引 还是倒着数的索引?), 返回值的含义(是正着数的索引 还是倒着数的索引?)
【52:50】string的插入
【53:33】string::insert(...)
【54:25】01_17_string的插入.jpg
【55:02】字符串的删除
string::erase(开始删除的字符的索引, 删除多少个字符)
删除 在我们其他容器里面都是采用 erase(...),比如 vector里面删除一个节点、map里面删除什么
【55:50】删除的例子
【56:29】string的替换
string::replace(...)
【57:05】有两个操作:
(1)、先把 索引值 和 个数 确定的字符(串) 删掉
(2)、然后再插入新字符(串)
【57:23】例子
【58:15】第一个replace() 和 第二个replace() 它们的功能是一样的,【58:22】第三个(还有一种),就是交换
【58:33】交换 的例子 --> string::swap(...)
【59:50】string 和 wstring 的区别
【01:00:30】string 和 wstring 的转换
01_18_string与wstring的转换.jpg
(1)、Windows API
(2)、ATL ==> COM ==> 这个也只能用于 Win平台...
【01:01:01】ZC:T2W、W2T 这两个PPT里面没有,是视频作者口头讲的
【01:01:08】01_19_string与wstring的转换.jpg
(3)、跨平台 CRT库 mbstowcs() / wcstombs(),需要设定locale
ZC: "设定locale"什么意思?是指需要“#include <locale.h>”吗?貌似还有 setlocale()等的函数需要调用。
【01:01:43】01_20_string与wstring的转换.jpg
【01:02:01】01_21_string与wstring的转换.jpg
【01:02:45】使用 string/wstring 的同一方案
【01:02:55】01_22_编码统一化,编写单一源代码.jpg
【01:03:30】本讲讲了如下要点:
【01:03:32】1、什么是 STL,STL的好处,广义上分为三类 ....
ZC:看 PPT 吧...
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
///////
C