简明STL

主要内容

输入输出、查找、迭代器

字符串输入输出操作

流运算符

"<<" 和 ">>" 提供了C++语言的字符串输入和字符串输出功能。

  • "<<" 可以将字符插入到一个流对象中(例如 ostream);
  • ">>" 可以实现将以空格或回车为 "结束符" 的字符序列读入到对应的字符串中,并且开头和结尾的空白字符不包括进字符串中。

getline() 函数

getline() 函数可将整行的所有字符读到字符串中,并且读取的方式更加多样。该函数的原型包括两种形式:

//包含2个参数:第1个参数是输入流对象_Istr;第2个参数是保存输入内容的字符串_Str
template<class CharType, class Traits, class Allocator>
basic_istream<CharType, Traits>& getline(basic_istream<CharType, Traits>& _Istr, basic_string<CharType,Traits, Allocator>& _Str);
//包含3个参数:第1个参数是输入流对象_ Istr,第 2 个参数保存输入的字符串_Str,第3个参数指定的分界符_Delim。
template<class CharType, class Traits, class Allocator>
basic_istream<CharType, Traits>& getline(basic_istream<CharType, Traits>& _Istr, basic_string<CharType, Traits, Allocator>& _Str, CharType _Delim);

在读取字符时,遇到文件结束符、分界符、回车符时,将终止读入操作,且文件结束符、分界符、回车符在字符串中不会保存;当已读入的字符数目超过字符串所能容纳的最大字符数时,将会终止读入操作。

字符串查找函数

在STL中,字符串的查找可以实现多种功能:

  • 搜索单个字符、子串;
  • 实现前向搜索、后向搜索;
  • 分别实现搜索第一个和最后一个满足条件的字符(或子串);

string::npos 静态成员常量

static const size_t npos = -1;

npos是静态成员常量值,值为size_t类型可能的最大值。

当这个值在字符串成员函数中的长度或者子长度被使用时,该值表示“直到字符串结尾”。作为返回值他通常被用作表明没有匹配

此常量的值定义为-1,由于size_type是无符号类型,故需转换为无符号整数类型,因此它是此类型可表示值的最大值。不过实际值还是取决于size_type的实际定义类型,即无符号整型 unsigned int 的-1或无符号长整型 unsigned long 的-1。

find() 和 rfind()

find() 或 rfind() 函数用于在源串中查找完全相同的字符(串)或子串。

find() 或 rfind() 函数没有搜索到期望的字符(或子串),则返回 npos;若搜索成功,find() 返回搜索到的第 1 个字符或子串的位置,rfind() 返回逆向搜索到的第 1 个字符或子串的位置。

find() 的使用方法:

在下面的代码中,约定使用以下标识符带代表相应变量或对象:

str表示原始string对象,sstr表示另一个string对象;cstr表示C风格字符串

ch表示char字符;pos为下标表示的位置

注:“cstr的前n个字符” 基本都可以替换为 char* 指针,类似 [_Ptr, _Ptr + _Count)

//在源串str中下标pos位置(默认为0)开始查找1个字符ch
str.find(ch, pos=0);
//在源串str中下标pos位置(默认为0)开始查找C风格字符串cstr
str.find(cstr, pos=0);
//在源串str中下标pos位置开始查找C风格字符串cstr的前num个字符的子串
str.find(cstr, pos, num);
//在源串str中下标pos位置开始查找字符串对象sstr
str.find(sstr, pos=0);

rfind() 函数的功能和 find() 函数的功能类似,参数情况也类似,不同之处pos默认为npos,逻辑为在源串中下标pos位置之前逆向查找。

find_first_of() 和 find_last_of()

find_first_of() 函数和 find_last_of() 函数的使用方式、参数表与上述基本相同。

find_first_of() 函数最容易出错的地方是和 find() 函数搞混。find_first_of() 最大的区别就是如果在一个源串中查找另一个字符串,如果源串中含有另一个字符串中的任何字符(或当实参为字符类型时,源串中含有指定字符),就会查找成功,并返回任何一个字符首次在源串中出现的位置(find_last_of() 与 rfind() 的逆向查找相似)。

find_first_not_of() 和 find_last_not_of()

find_first_not_of() 函数和 find_last_not_of() 函数的使用方式、参数表与上述基本相同。

find_first_not_of() 函数可实现在源串中搜索与指定字符(串)不相等的第 1 个字符;find_last_not_of() 函数可实现在源串中搜索与指定字符(串)不相等的最后 1 个字符(与 rfind() 的逆向查找相似)。

string类的迭代器

迭代器的定义

string::iterator 迭代器名称;

几个常用的迭代器

begin() 和 end() 为正向迭代提供支持;rbegin() 和 rend() 为反向迭代提供支持。

  • begin() 返回指向字符串第一个字符的迭代器;

  • end() 返回指向字符串最后一个字符串的后一个位置的迭代器;

  • rbegin() 返回指向字符串最后一个字符的迭代器;

  • rend() 返回指向字符串第一个字符的前一个位置的迭代器。

迭代器的使用:

for (string::iterator iter = str.begin(); iter != str.end(); iter++) {    //……
}

有关使用到迭代器的成员函数,具体可以参看文章:C++ string类(上)