1) 字符串拼接
cout<< “hello” “ everyone”
“how are you”<<endl;
2) C++字符串类与C字符数组的比较
l 定义
typedef basic_string<char> string;
typedef basic_string<wchar> wstring;
template<class charT,
class traits = char_traits<chart>,
class allocator = allocator<charT> >
class basic_string{};
traits控制多种字符集的比较行为。
allocator控制字符串内存分配策略。
l 无需担心空间的大小,其会动态增加
l 无需担心是否以’/0’结尾
l 无需担心是否越界
l 提供一系列成员函数方法操纵字符串
l 构造函数帮助我们初始化字符串为0(C为随机值)
3) 构造函数/字串
l 默认构造
#include <string>
using namespacec std;
string str; //长度为0, 容量capacity为15
l 拷贝构造
string str1;
string str2(str1, 开始索引,拷贝个数)
string str3(str2.begin(), str2.end())
string str4(个数,‘a’); //用n个a初始化
l 子串
string str1;
string str2 = str1.substr(开始索引,个数);
str2 = str1.substr(); //拷贝整个串
str2 = str1;
4) 长度/容量
l size()/length()获得字符串大小
l capacity()获得目前容量,包括字符串大小在内
l reserve()表示预留多少空间,可提高效率
l resize()默认行为可缩短字符串,或增大字符串(填充空格),用重载版本可填充别的字符。
注意:resize缩短字符串并不会改变原有的capacity()大小。
5) 操作
l 替换
replace(被替换字符串开始处,替换字符数,替换字符串);
替换不会增加字符串空间,除非替换开始处+替换字符数超出了字符空间,那么这种情况跟插入差不多了。
l 查找
1) 找第一个子串
index = find(要查找的字符串,查找开始处)
找到了则index != string:npos。
2) 找第一个子串
index = find_first_of(要查找的字符串,查询开始处)
找到了则index != string:npos。
3) 找最后一个子串
index = find_last_of(要查找的字符串,查询开始处)
找到了则index != string:npos。
4) 找第一个不在字符串里的字符的位置
index = find_first_not_of(要查找的字符串,查询开始处)
找到了则index != string:npos。
比如:string str = “hello, yeqianxun!”;
find_first_not_of(“hey, yeming”, 0);
l不在字串里,所以返回2
5) 找最后一个不在字符串里的字符的位置
index = find_last_not_of(要查找的字符串,查询开始处)
找到了则index != string:npos。
6) 反向查找
string str = “hello, body, hello, everyone!”;
index = rfind(“hello”);//返回13
如果rfind(“hello”,0),则和find(“hello”)一样。
注意:string::npos == 0xFFFF FFFF
l 删除
erase(); //删除所有
erase(开始删除的位置,删除的个数 = sring::npos); //默认是npos,所以删除所有。
l 字符定位
1) [index]
char c = str[0];
2) at(index)
如果越界会抛出out_of_range异常,比较安全。
关于异常,请参考
http://blog.csdn.net/yeming81/archive/2010/06/16/5673070.aspx
l 比较
1) 用==比较
string str1;
string str2;
str1 == str2;
“hello” == str1; //合法
2) 字符串部分比较 compare
compare(本串开始比较位置,比较字符数,要比较的字符串,其开始比较处,比较字符数)
l 其他
insert插入子串、append附加子串到末尾、c_str返回以0结尾的C型字符串。
6) 重载特性
l 忽略大小写的比较
1) string类没有包含忽略大小写的比较,因为不同语言对大小写的定义不一样,很难统一。另外一个原因是,字符集相关的功能由traits模板提供。
2) 定义自己的traits类
struct myTraits : char_traits<char>
{
static bool eq(char cFirst, char cSecond)
{
return toupper(cFirst) == toupper(cSecond);
}
static bool ne(char cFirst, char cSecond)
{
return !eq(cFirst, cSecond);
}
static bool lt(char cFirst, char cSecond)
{
return toupper(cFirst) < toupper(cSecond);
}
static int compare(const char* str1, const char* str2,
size_t count)
{
//比较str1和str2的前count个字符,忽略大小写
}
static const char* find(const char* str1, size_t count,
char c)
{
//找出c在str1中的位置,忽略大小写
}
};
3) 定义自己的字符串类
typedef basic_string<char, myTraits> MyString;
4) 重载新字符串输出
ostream& operator<<(ostream& os, const MyString& str);