cprime笔记(编辑修改稿)内容摘要:

const_iterator begin() const。 iterator begin()。 const_iterator end() const。 iterator end()。 插入字符串 成员函数 insert 实现在某点处插入字符串。 简化函数原型如下: stringamp。 insert(size_type p0, const char *s)。 stringamp。 insert(size_type p0, const char *s, size_type n)。 stringamp。 insert(size_type p0, const stringamp。 str)。 stringamp。 insert(size_type p0, const stringamp。 str, size_type pos, size_type n)。 stringamp。 insert(size_type p0, size_type n, char c)。 iterator insert(iterator it, char c)。 void insert(iterator it, const_iterator first, const_iterator last)。 void insert(iterator it, size_type n, char c)。 注意: insert 函数是在插入点 (p0 or it)之前插入字符串。 删除子串 成员函数 erase 实现删除某个子串。 简化函数原型如下: iterator erase(iterator first, iterator last)。 iterator erase(iterator it)。 stringamp。 erase(size_type p0 = 0, size_type n = npos)。 如果指定删除的字符个数比字符串中从指定位置开始的剩余字符个数还多,那么只有这些字符被删除。 查找子串 查找子串有六种方式,分别有五类成员函数与之应。  find 查找控制字符序列中与操作字符序列匹配的第一个子串,并返回子串的起始位置;  rfind 查找控制字符序列中与操作字符序列匹配的最后一个子串,并返回该子串的起始位置,相当于逆向查找;  find_first_of 查找控制字符序列中第一个出现在操作字符序列中的字符的位置,并返回该位置;  find_first_not_of 查找控制字符序列中第一个不出现在操作字符序列中的字符的位置,并返回该位置;  find_last_of 查找控制字符序列中最后一个出 现在操作序列中的字符的位置,并返回该位置;  find_last_not_of 查找控制字符序列中最后一个不出现在操作字符序列中的字符位置,并返回该位置; 如果这些函数查找失败,则返回 string::npos。 其中, find 函数的简化函数原型如下: size_type find(char c, size_type pos = 0) const。 size_type find(const char *s, size_type pos = 0) const。 size_type find(const char *s, size_type pos, size_type n) const。 size_type find(const stringamp。 str, size_type pos = 0) const。 另外的五个函数的函数原型和 find 的函数原型类型类似,区别在于,如果是是逆序查找的函数 (rfind, find_last_of, find_last_not_of),则 pos 参数默认值为 npos。 其它成员函数和友元函数 size_type capacity() const。 // 返回当前字符串的 存储空间大小 = size() void reserve(size_type n = 0)。 // 保证 capacity()=n bool empty() const。 // 若字符串为空,返回 true size_type size() const。 // 返回字符串长 size_type length() const。 // 等于 size() size_type max_size() const。 //返回 string 类中字符串的最大长度 void resize(size_type n, char c = 39。 39。 )。 //若长度不够,则用 c 填充加长的部分;保证 size()返回 n void swap(stringamp。 str)。 //两 string 对象交换,能在常数时间内完成(必须是使用相同 allocator 的两对象,这里都使用的默认的) // 其它非成员函数 istreamamp。 getline(istreamamp。 is, stringamp。 str)。 istreamamp。 getline(istreamamp。 is, stringamp。 str, char delim)。 ostreamamp。 operator(ostreamamp。 os, const stringamp。 str)。 istreamamp。 operator(istreamamp。 is, const stringamp。 str)。 其中, istreamamp。 getline(istreamamp。 is, stringamp。 str)。 相当于 istreamamp。 getline(istreamamp。 is, stringamp。 str, char delim = 39。 \n39。 )。 getline 函数在下列三种情况下结束提取: 1)遇到文件结束符; 2)遇到分隔符 delim。 如果第一个就是分隔符, str 为空串(并且该分隔符被从流中读出丢弃),但 istream 测试为真; 3)如果已经提取了 ()个字符,那么提取结束,并且将调用 (ios_base::failbit),即此时返回的 istream 测试为假。 如果函数没有提取到字符(包括分隔符),那么将调用 (failbit),此时测试 istream 为假。 默认情况下 , istreamamp。 operator(istreamamp。 is, const stringamp。 str)。 在下 列三种情况下结束提取: 1)遇到文件结束符; 2)遇到空白字符(空格、 Tab、换行); 3)如果已经提取了 ()个字符,或者提取了 ()(非 0 情况下)个字符。 如果没有提取到任何非文件结束符的字符(包括空白字符),那么将调用 (failbit),此时测试 istream为假。 例如,看看下面的循环: while(cin word) { cout word read is: word 39。 \n39。 } 要中止上面的循环应该用文件结束符: Win——Ctrl+Z Unix——Ctrl+D 并且,应该是输入行的第一个字符就是文件结束符,然后回车才能结束循环。 应用举例 替换 string 对象中所有子串 在上面 string 类的成员函数中,没有替换 string 对象中所有子串的方法。 我们可以利用 find 和 replace 这 两个成员函数来实现该目标,代码如下: stringamp。 replaceAll(stringamp。 context, const stringamp。 from, const stringamp。 to) { // replace all substring 39。 from39。 with substring 39。 to39。 in string context string::size_type curPos = 0。 string::size_type foundPos = 0。 while ((foundPos = (from, curPos)) != string::npos) { (foundPos, (), to)。 curPos = foundPos + ()。 } return context。 } 除了上面这个通用方法,对于特殊的需求,我们还可以有更简单的方法。 如果我们只需要用一个字符替换 string 对象中的另一个字符,则可以用标准库提供的模板类算 法 replace 实现该目标,其原型如下: templatecaass FwdIt, class T void replace(FwdIt first, FwdIt last, const Tamp。 vold, const Tamp。 vnew)。 把该算法应用 string 对象,可以这样使用: replace((), (), 39。 F39。 , 39。 T39。 )。 这样就可以把 string 对象 s 中所有的 F 字符替换为 T 字符。 提取网页文件中的 Email地址 如果要抓取互联 网上的 Email地址(如 WebSpider),需要提取抓取到的网页文件里的 URL 和 Email地址。 假如这里需要提取 Email地址,那么可以利用 string 类方便的进行提取工作。 下面提供了一个实现该功能的源码示例(从我的一个程序里截取出来的): void RetrieveEmailFromPage(const stringamp。 page, const stringamp。 url) { int posCur = 0, posStart, posAt, posEnd, posTmp。 string。 string tags = ._ abcdefg hijklmn opqrst uvwxyz ABCDEFG HIJKLMN OPQRST UVWXYZ 0123456789。 while (true) { if ((posAt = (39。 @39。 , posCur)) != string::npos) { posStart = (tags, posAt 1) + 1。 // find_last_not_of 查找控制字符序列中最后一个不出现在操作字符序列中的字符位置,并返回该位置; posEnd = (tags, posAt + 1)。 posTmp = (39。 .39。 , posAt + 1)。 // domain has at least one dot if (posTmp != string::npos amp。 amp。 posTmp posEnd 1 amp。 amp。 posStart != posAt amp。 amp。 posEnd != posAt + 1) { = (posStart, posEnd posStart)。 AddEmail(, url)。 // add the to special data struct } posCur = posEnd。 } else { return。 } }//while } 忽略大小的字符串比较 string 类没有提供忽略大小写的比较。 我们可以利用 basic_string 模板类来实现。 basic_string 的特化类的比较是通过其模板参数 char_traits 定义的。 所以我们需要重新实现一个忽略大小写的 char_traits 类,然后用它特化 basic_string。 下面分别实现了窄字符和宽字符版本。 源程序如下: //: ifndef ICHAR_TRAITS_H define ICHAR_TRAITS_H include string include cctype include cwctype include ostream /////////////////////////////////////////////////////////////////////// using std::toupper。 struct ichar_traits: std::char_traits char { static bool eq(char c1, char c2) { return toupper(c1) == toupper(c2)。 } static bool lt(char c1, char c2) { return t。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。