深入学习 C++ String
董波
QQ: 84638372
Email: dbdongbo@vip.qq.com
Blog: http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2
2008-2009
董波 QQ:84638372
深入学习C+++string2.1 版
目录
目录 ................................................................................................................................................................................................................................................... 1
正文................................................................................................................................................................................................................................................... 4
C++的 string 的使用.......................................................................................................................................................................................................4
一、
1.1 C++ string 简介........................................................................................................................................................................................................ 4
1.2
string 的成员....................................................................................................................................................................................................... 4
1.2.1 append .............................................................................................................................................................................................................. 4
assign .................................................................................................................................................................................................... 5
1.2.2
at .............................................................................................................................................................................................................. 5
1.2.3
1.2.4
begin.......................................................................................................................................................................................................6
c_str.......................................................................................................................................................................................................6
1.2.5
capacity ................................................................................................................................................................................................6
1.2.6
1.2.7
clear.......................................................................................................................................................................................................7
compare..................................................................................................................................................................................................7
1.2.8
copy ......................................................................................................................................................................................................... 7
1.2.9
1.2.10
_Copy_s..................................................................................................................................................................................................7
data ......................................................................................................................................................................................................... 7
1.2.11
empty.......................................................................................................................................................................................................7
1.2.12
1.2.13
end............................................................................................................................................................................................................7
erase.......................................................................................................................................................................................................7
1.2.14
find ......................................................................................................................................................................................................... 7
1.2.15
1.2.16
find_first_not_of..........................................................................................................................................................................8
find_first_of................................................................................................................................................................................... 9
1.2.17
find_last_not_of ............................................................................................................................................................................ 9
1.2.18
find_last_of ......................................................................................................................................................................................9
1.2.19
1.2.20
get_allocator................................................................................................................................................................................... 9
insert .................................................................................................................................................................................................... 9
1.2.21
length .................................................................................................................................................................................................... 9
1.2.22
1.2.23
max_size ................................................................................................................................................................................................9
push_back............................................................................................................................................................................................. 9
1.2.24
rbegin .................................................................................................................................................................................................... 9
1.2.25
1.2.26
rend ......................................................................................................................................................................................................... 9
replace..................................................................................................................................................................................................9
1.2.27
reserve................................................................................................................................................................................................11
1.2.28
1.2.29
resize .................................................................................................................................................................................................. 12
rfind.....................................................................................................................................................................................................12
1.2.30
size ....................................................................................................................................................................................................... 12
1.2.31
1.2.32
substr .................................................................................................................................................................................................. 12
swap ....................................................................................................................................................................................................... 12
1.2.33
string 的构造..................................................................................................................................................................................................... 12
string 的重载运算符 ......................................................................................................................................................................................... 13
string 与 algorithm 相结合的使用 ............................................................................................................................................................. 13
1.5.1 string 与 remove....................................................................................................................................................................................... 13
1.5.2 string 与 unique、sort..........................................................................................................................................................................13
1.5.3 string 与 search....................................................................................................................................................................................... 13
string 和 find、find_if..............................................................................................................................................................14
1.5.4
string 与 copy、copy_if..............................................................................................................................................................14
1.5.5
1.5.6
string 与 count、count_if .........................................................................................................................................................15
string 与 wstring ............................................................................................................................................................................................15
1.6.1 简介...................................................................................................................................................................................................................15
1.6.2 wstring 实例 .................................................................................................................................................................................................16
wstring 与控制台...............................................................................................................................................................................16
1.6.3
string 与 wstring 的相互转换 ...................................................................................................................................................... 17
1.6.4
string 与 C++流................................................................................................................................................................................................. 22
1.7.1 C++流简介 ....................................................................................................................................................................................................... 22
1.7.2 string 与 iostream、fstream ..............................................................................................................................................................22
1.8 格式化字符串 ................................................................................................................................................................................................................23
1.8.1 简单常用的 C 方法.......................................................................................................................................................................................... 23
1.8.2 boost 的方法 ................................................................................................................................................................................................. 23
1.8.3 stlsoft + fastformat .......................................................................................................................................................................... 24
1.9 string 与 CString ..................................................................................................................................................................................................24
boost 字符串算法库 ......................................................................................................................................................................................................24
2.1 boost 字符串算法库导论 ..........................................................................................................................................................................................24
1.3
1.4
1.5
二、
1.6
1.7
1
董波 QQ:84638372
三、
深入学习C+++string2.1 版
2.1.1 boost.algorithm.string 是什么?.................................................................................................................................................... 24
2.1.2 相关...................................................................................................................................................................................................................24
2.1.3 boost.range 导论 .......................................................................................................................................................................................24
2.1.4 boost.regex 导论 .......................................................................................................................................................................................24
2.1.5 boost.algorithm.string 的 DNA ........................................................................................................................................................25
2.2 boost 字符串算法解密 ..............................................................................................................................................................................................25
2.2.1 修剪(trim.hpp)....................................................................................................................................................................................... 25
2.2.2 转换(case_conv.hpp) ...............................................................................................................................................................................27
2.2.3 判断式、断言函数(predicate.hpp)【Predicates】 .....................................................................................................................28
2.2.4 查找...................................................................................................................................................................................................................29
2.2.5 删除和替换 .......................................................................................................................................................................................................30
2.2.6 分割和组合 .......................................................................................................................................................................................................32
2.2.7 分词...................................................................................................................................................................................................................33
2.2.8 其它...................................................................................................................................................................................................................33
C 字符串..........................................................................................................................................................................................................................33
3.1 C 字符串常用算法 ........................................................................................................................................................................................................33
3.1.1 strcpy wcscpy ........................................................................................................................................................................................... 33
3.1.2 strcat wcscat ........................................................................................................................................................................................... 33
3.1.3 strchr wcschr ........................................................................................................................................................................................... 33
3.1.4 strcmp wcscmp ........................................................................................................................................................................................... 34
3.1.5 stricmp wcsicmp...................................................................................................................................................................................... 34
3.1.6 strlen wcslen ........................................................................................................................................................................................... 34
3.1.7 strlwr/_strlwr wcslwr/_wcslwr .................................................................................................................................................... 34
3.1.8 strncat wcsncat...................................................................................................................................................................................... 34
3.1.9 strcspn wcscspn...................................................................................................................................................................................... 34
3.1.10 strdup/_strdup wcsdup/_wcsdup ..................................................................................................................................................35
3.1.11 strncpy wcsncpy ....................................................................................................................................................................................35
3.1.12 strpbrk wcspbrk ....................................................................................................................................................................................36
3.1.13 strrev/_strrev wcsrev/_wcsrev ..................................................................................................................................................36
3.1.14 strset/_strset/_strset_l wcsset/_wcsset/_wcsset_l ................................................................................................36
3.1.15 strstr/wcsstr .........................................................................................................................................................................................36
3.1.16 strtok/wcstok .........................................................................................................................................................................................37
3.1.17 strupr/_strupr wcsupr/_wcsupr ..................................................................................................................................................37
3.2 更安全的 C 字符串函数 ...............................................................................................................................................................................................37
3.2.1 简述...................................................................................................................................................................................................................37
3.2.2 简单实例...........................................................................................................................................................................................................38
3.2.3 定制...................................................................................................................................................................................................................39
3.2.4 兼容...................................................................................................................................................................................................................42
3.3 通用字串函数 ................................................................................................................................................................................................................48
3.3.1 简述...................................................................................................................................................................................................................48
3.3.2 简单实例...........................................................................................................................................................................................................48
3.3.3 映射表...............................................................................................................................................................................................................49
3.4 API 级的字符串处理 ...................................................................................................................................................................................................49
3.4.1 简述...................................................................................................................................................................................................................49
3.4.2 旧的 API ...........................................................................................................................................................................................................49
3.4.3 Shell 字符串函数 ......................................................................................................................................................................................... 49
3.4.4 新的安全版字符串处理 API .......................................................................................................................................................................... 49
c++字符串分词 ...............................................................................................................................................................................................................52
4.1 简介 ..................................................................................................................................................................................................................................52
4.2 C 库....................................................................................................................................................................................................................................52
4.3 C++ stringstream............................................................................................................................................................................................................... 53
4.4 boost 字符串算法库的分词技术.....................................................................................................................................................................................53
4.4.1 泛型算法 ...............................................................................................................................................................................................................53
4.4.2 迭代器...................................................................................................................................................................................................................54
4.5 boost.tokenizer..................................................................................................................................................................................................................55
4.5.1 组件 .......................................................................................................................................................................................................................55
4.5.2 工具类解析...........................................................................................................................................................................................................56
4.5.3 boost.tokenizer 的缺陷 ..........................................................................................................................................................................................59
4.6 stlsoft::string_tokeniser .................................................................................................................................................................................................... 61
4.7 效率大 PK.........................................................................................................................................................................................................................61
C++字符串使用的建议 ...................................................................................................................................................................................................64
五、
附录 1:参考资料:......................................................................................................................................................................................................................64
附录 2: MSSTL 中 basic_string 的部分源码解读 ..................................................................................................................................................................64
2.1 string 的 allocator ............................................................................................................................................................................................. 65
2.1.1 Allocate 和 Deallocate.........................................................................................................................................................................65
四、
2
深入学习C+++string2.1 版
董波 QQ:84638372
2.1.2 allocator 的泛型实现 ................................................................................................................................................................................65
2.1.3 string 与 char_traits ........................................................................................................................................................................... 67
2.1.4 以 char 和 wchar_t 特化 char_traits ................................................................................................................................................ 69
附录 3 TCHAR.h 映射表................................................................................................................................................................................................................70
日志:............................................................................................................................................................................................................................................. 77
1.0 版 ....................................................................................................................................................................................................................................77
1.1 版 ....................................................................................................................................................................................................................................77
1.2 版 ....................................................................................................................................................................................................................................77
2.0 版 ....................................................................................................................................................................................................................................77
2.1 版 ....................................................................................................................................................................................................................................77
3
董波 QQ:84638372
简介:
深入学习C+++string2.1 版
正文
字符串处理是程序设计语言的一个重要的组成部分。有的字符串是内置的(VB 等),有的是模拟的(C 字符串为字符集合,算法等以库的形式
提供),而 C++所提供的字符串 std::string 是以库的形式提供的。
学习 string 相关的操作是学习 C++语言很重要的一个内容,灵活的使用 string 对我们的程序设计是非常有帮助的,熟练使用 string 以
及其相关的算法也是一项基本技能。
本文将对 C++的 string 体系做一些讨论,主要内容包括:
1.string 的使用
2.boost.algorithm.string 的使用以及其部分源码分析。
3.C 风格字符串的操作和使用。
4.字符串分词库。
5.一些关于字符串使用的建议。
本文档是《C++ String 深入详解 2.0 的升级版》。
声明:
本文中选择的源码为 MSSTL 和 boost1.37,例子为作者亲手所写,如果代码来自网络或者其它地方我会尽量声明出处。人难免会有疏漏,
所以可能会有照顾不周的地方,我也无意侵害您的权益,如果您发现了这样的情况在本文档中出现,请您通知我,我保证马上更正。本文中凡是
作者原创的内容,您可以随意修改与使用,欢迎您传播。
另外如果您发现文档中有疏漏的地方请您及时通知我,我会及时修改,免得误导更多的朋友,谢谢!
如果您有问题或者意见请到这里参与讨论:
http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/2177742e8e067f5a4fc2268b.html
一、 C++的 string 的使用
1.1 C++ string 简介
C++兼容 C 对字符串的处理方式,与此同时还在标准库(STL)中提供了 string 容器,我们可以很容易的使用 string 来进行字符串处理。
而且 string 还能很好的与标准库中的泛型算法结合起来使用,非常的方便。虽然在 MFC 等框架中也提供了诸如 CString 这样的字符串处理类,
但是个人认为 STL 的 string 依然是最棒的,使用标准库提供的 string 可以轻松的与原来的 C API 兼容,也可以很好的与系统底层的 API 兼
容。
1.2 string 的成员
1.2.1 append
在尾部添加字符或者字符串
append 共有 8 种重载,分别如下:
basic_string& append(
const value_type* _Ptr
);
// 添加一个C风格的字符串_Ptr
basic_string& append(
const value_type* _Ptr,
size_type _Count
);
// 添加 C风格的字符串 _Ptr中的_Count个字符
basic_string& append(
const basic_string& _Str,
size_type _Off,
size_type _Count
); // 添加_Str从第_Off个开始的_Count个字符串
basic_string& append(
const basic_string& _Str
); // 添加一个_Str
basic_string& append(
size_type _Count,
value_type _Ch
); // 添加_Count个_Ch
template
basic_string& append(
InputIterator _First,
InputIterator _Last
); // 添加迭代器指定的范围内的字符【可以来自其它容器】
basic_string& append(
const_pointer _First,
const_pointer _Last
4
深入学习C+++string2.1 版
basic_string& append(
); // 来自const_pointer
const_iterator _First,
const_iterator _Last
); // 来自const_iterator
董波 QQ:84638372
例子:
MSDN
1.2.2 assign
为字符串重新赋予新的内容。
你可以将它看做先把字符串清空,然后再 append。因此 assign 也有 8 种重载。
例子:
#include
#include
#include
using namespace std;
int main()
{
string str( "Hello World!" );
cout<< str << endl;
str.assign( istream_iterator(cin), istream_iterator() );
cout<< str << endl;
return 0;
}
输出实例:
Hello World!
Dongbo! JiaYou!
^Z
Dongbo!JiaYou!
请按任意键继续. . .
1.2.3 at
类似于[]取值,根据调用情况分别返回 reference 或者 const_reference。
与[]的差别:
reference __CLR_OR_THIS_CALL at(size_type _Off)
{ // subscript mutable sequence with checking
if (_Mysize <= _Off)
_String_base::_Xran(); // _Off off end
return (_Myptr()[_Off]);
}
const_reference __CLR_OR_THIS_CALL at(size_type _Off) const
{ // subscript nonmutable sequence with checking
if (_Mysize <= _Off)
_String_base::_Xran(); // _Off off end
return (_Myptr()[_Off]);
}
reference __CLR_OR_THIS_CALL operator[](size_type _Off)
{ // subscript mutable sequence
#if _HAS_ITERATOR_DEBUGGING
// skip debug checks if the container is initizialed with _IGNORE_MYITERLIST
if (this->_Myfirstiter != _IGNORE_MYITERLIST)
{
if (_Mysize < _Off)
{
_DEBUG_ERROR("string subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
5
深入学习C+++string2.1 版
}
}
董波 QQ:84638372
#else
_SCL_SECURE_VALIDATE_RANGE(_Off <= _Mysize);
#endif /* _HAS_ITERATOR_DEBUGGING */
return (_Myptr()[_Off]);
}
const_reference __CLR_OR_THIS_CALL operator[](size_type _Off) const
{ // subscript nonmutable sequence
#if _HAS_ITERATOR_DEBUGGING
// skip debug checks if the container is initizialed with _IGNORE_MYITERLIST
if (this->_Myfirstiter != _IGNORE_MYITERLIST)
{
if (_Mysize < _Off) // sic
{
_DEBUG_ERROR("string subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
}
#else
_SCL_SECURE_VALIDATE_RANGE(_Off <= _Mysize);
#endif /* _HAS_ITERATOR_DEBUGGING */
return (_Myptr()[_Off]);
}
1.2.4 begin
因此我们可以指导,at 遇到越界的时候是抛出异常,而重载[]是_DEBUG_ERROR!
返回指向 string 首部的 iterator 或者 const_iterator。
1.2.5 c_str
返回 C 风格的字符串。可以与以前的 API 进行兼容。
关于“判等”的效率:
当 string 对象 str 与 const _Elem * _Ptr 比较之时有人这么做:
0 == strcmp( str.c_str(), _Ptr );
实际上这和 str == _Ptr 效果一样,效率也是一样。因为:
template _CRTIMP2_PURE bool __CLRCALL_OR_CDECL operator==(
const basic_string, allocator >&,
因为库编写者也考虑到了这种情况。
const char *);
1.2.6 capacity
返回如果不再进行内存分配的话共能放多少字符。
例子:
#include
#include
using namespace std;
int main()
{
string str( "Hello World!" );
cout<< str.size() << endl;
cout<< str.capacity() << endl;
cout<< str.max_size() << endl;
cout<< str.append( " Haha!" ) << endl;
cout<< str.size() << endl;
cout<< str.capacity() << endl;
return 0;
6
深入学习C+++string2.1 版
董波 QQ:84638372
}
输出:
12
15
4294967294
Hello World! Haha!
18
31
请按任意键继续. . .
1.2.7 clear
删除所有字符。
1.2.8 compare
以字典顺序进行比较。>为正,=为零,<为负。
1.2.9 copy
拷贝,为内部调用。
1.2.10 _Copy_s
非标准,MSSTL only!为 copy 所调用。
1.2.11 data
与 c_str()相同。
1.2.12 empty
返回字符串是否为空。
1.2.13 end
返回指向末尾的 iterator 或者 const_iterator。不能对其返回值提领!
1.2.14 erase
iterator _First,
iterator _Last
); // 删除指定范围 返回的是被删除位置的后一个元素的新位置
删除字符串。
iterator erase(
iterator erase(
iterator _It
); // 删除指定位置
basic_string& erase(
size_type _Pos = 0,
size_type _Count = npos
); // 删除从_Pos开始的_Count个,当_Count为npos时,则为删除_Pos以及其后的部分!
1.2.15 find
在字符串中查找字符或者字符串。
size_type find(
value_type _Ch,
size_type _Off = 0
) const; // 从_Off开始查找_Ch,返回index。
size_type find(
const value_type* _Ptr,
size_type _Off = 0
) const; // 从_Off开始查找_Ptr
size_type find(
const value_type* _Ptr,
size_type _Off,
size_type _Count
) const; // 从_Off开始查找_Ptr的前_Count个子串,有意义吗?
const basic_string& _Str,
size_type _Off = 0
) const; // 从_Off 开始查找_Str
size_type find(
7