写在前面:
此表方便快速查看各个函数的功能,详细解释以及功能测试后面均会测试
string函数表:
函数 | 函数说明 |
---|---|
size()、length() | 返回字符数量 |
max_size() | 返回字符的可能最大个数 |
empty() | 判断字符串是否为空,是空时返回ture,不是空时返回false |
capacity() | 返回重新分配之前的字符容量 |
reserve() | 保留一定量内存以容纳一定数量的字符 |
resize() | 用来重新分配字符串的大小 |
=、assign() | 赋以新值 |
swap() | 交换两个字符串的内容 |
+=、append()、push_back() | 在尾部添加字符 |
insert() | 插入字符 |
erase() | 删除字符 |
pop_back() | 删除尾字符 |
clear() | 清空全部字符 |
replace() | 替换字符 |
+ | 串联字符串 |
==、!=、<、<=、>、>=、compare() | 比较字符串 |
[]、at() | 存取单一字符 |
>>、getline() | 从stream读取某值 |
<< | 将谋值写入stream |
copy() | 将某值赋值为一个C_string |
c_str()、data() | 将内容以字符数组形式(char *)返回 |
substr() | 返回某个子字符串 |
find()、rfind()、find_first_of()、find_last_of()、find_first_not_of()、find_last_not_of() | 搜索与查找字符串 |
begin() end() | 提供类似STL的迭代器支持 |
rbegin() rend() | 逆向迭代器 |
get_allocator() | 返回配置器 |
一、string对象的构造
/*string的一般构造方法*/
string s1; //默认初始化,s1是一个空串
string s2(s1); //s2是s1的副本
string s2=s1; //等价于s2(s1),s2是s1的副本
string s3("value"); //s3是字面值"value"的副本,除了字面值最后的那个空字符\0外
string s3="value"; //等价于s3("value"),s3是字面值"value"的副本
string s4(n,'c'); //把s4初始化为由连续n个字符c组成的串
/*string的其他构造方法*/
/*注意:n,len2和pos2都是无符号值(unsigned int)*/
string s(cp,n); //s是cp指向的数组中的前n个字符的拷贝。此数组至少应该包含有n个字符
string s(s2,pos2); //s是string s2从下标pos2开始的字符拷贝。若pos2>s2.size(),则此构造函数未定义
string s(s2,pos2,len2); //s是string s2从下标pos2开始len2个字符的拷贝。若pos2>s2.size(),则此构造函数无意义。不管len2的值是多少,构造函数至多拷贝s2.size()-pos2个字符
/*使用STL迭代器初始化string对象*/
string s1(s2.begin(),s2.end()); //使用s2的字符串初始化s1,注意区间范围[s2.begin(),s2.end()),右开左闭区间,右边的值取不到
注:所有字符串后编译器都会为其自动添加空字符\0,使用size()或者lenth()测量的是空字符\0之前的字符数。
测试代码如下:
void test1()
{
string s1; //s1空字符串
string s2 = "value"; //s2为字面值value的拷贝
string s3(10, 'A'); //s3为10个A
const char *cp = "hello,world!";
string s4(cp, 5); //s4为hello,拷贝cp的前5个字符
string s5(s3, 0); //s5为s3从下标0的拷贝
string s6(s3, 0, 5); //s6为s3从下标0开始的5个字符
string s7(s4.begin(), s4.end()); //s7为s4的拷贝
cout << "s1:" << s1 << endl;
cout << "s2:" << s2 << endl;
cout << "s3:" << s3 << endl;
cout << "s4:" << s4 << endl;
cout << "s5:" << s5 << endl;
cout << "s6:" << s6 << endl;
cout << "s7:" << s7 << endl;
}
运行结果如下:
二、string对象的容量
s.size():返回string对象的大小,即string对象中的字符数。
s.length():与size()一样都是返回string对象中的字符个数。
s.max_size():返回的是string对象最多包含的字符数,超出会抛出length_error异常。
s.capacity(): 不分配内存的话,s可以保存的字符数。
s.reserve(n):分配至少能容纳n个元素的内存空间。reserve并不能影响s中的字符数,但是可以影响预先分配的内存空间。
s.resize(n)或s.resize(n,c):调整s的字符数为n。对于前者,若n<s.size(),则多的元素被抛弃;若n>s.size(),则对添加的字符进行值初始化。对于后者,调整s为n个字符,多的字符为c。
s.empty():返回的是一个bool值,string对象为空返回true,否则返回false。
注:size()返回值类型是string::size_type这样一个无符号类型整数。一条表达式中有size()就不要使用int,这样可以避免int与unsigned混淆带来的后果。
测试代码如下:
void test2()
{
string s1 = "123456";
//s1.reserve(8);
cout << "size:" << s1.size() << endl;
cout << "length:" << s1.length() << endl;
cout << "max_size:" << s1.max_size() << endl;
cout << "capacity:" << s1.capacity() << endl;
cout << "Is s1 empty?" << (s1.empty() == true ? "yes" : "no") << endl;
s1.resize(10,'c');//s1变为123456cccc
cout << s1 << endl;
}
测试结果如下:
三、string对象的操作
s.clear():清空s中的所有字符。函数返回void。
s.pop_back():删除s的末尾字符。如s为空,则函数行为未定义。函数返回void。
s.push_back(t):在字符串s的尾部创建一个值为t的元素。函数返回void。
s.erase§:这里的p表示指向容器某个元素的迭代器。删除迭代器p所指定的元素,返回迭代器p之后元素的迭代器。若p指向尾元素,则返回尾后迭代器。若p指向尾后迭代器,则函数未定义。
s.erase(b,e):删除迭代器b和e所指定范围内的元素。[b,e),返回迭代器e,因为e不删除。若e是尾后迭代器,则函数返回尾后迭代器。
s.substr(pos,n):返回一个string,包含s中从pos开始的n个字符的拷贝。pos的默认值为0,n的默认值为s.size()-pos,即拷贝从pos开始的所有字符。
测试代码:
void test3()
{
string s = "hello world!";
s.pop_back();//删除尾元素!
cout << "After pop_back of s:" << s << endl;
s.push_back(',');//添加尾元素,
cout << "After push_back of s:" << s << endl;
s.insert(6, "cha ru ");//' '后插入" cha ru"
cout << "After insert of s:" << s << endl;
s.erase(5, 7);//删除"cha ru "
cout << "After erase of s:" << s << endl;
s.assign("xiaonengNB");//将s替换为"xiaonengNB"
cout << "After assign of s:" << s << endl;
s.append("hhhh");
cout << "After append of s:" << s << endl;
s.insert(0, "55555");
cout << "After insert of s:" << s << endl;
s.replace(s.begin(), s.end(), 10,'1');
cout << "After replace pf s:" << s << endl;
}
运行结果如下:
四、string对象的元素访问
c.at(n):返回下标为n的字符的引用。如果下边越界,则抛出out_of_range异常。
c[n]:返回c中下标为n的字符的引用,n是一个无符号整数。若n>=c.size(),则函数行为未定义。
c.back():返回c中尾字符的引用。若c为空,函数行为未定义。
c.front():返回c中首字符的引用。若c为空,函数行为未定义。
c.data():返回指向字符串c首地址的指针。
c.c_str():返回指向字符串c首地址的const指针。
注意:返回的前4个函数返回的是字符元素的引用。若容器是一个const对象,则返回值是const引用,不可修改。若容器不是const的,则返回值是普通引用,可以修改元素的值。
测试代码如下:
void test4()
{
string s = "hello world";
s.at(0) = 'H'; //引用作为左值,修改首元素为H
s[10] = 'D'; //引用作为左值,修改尾元素为D
cout << "s:" << s << endl;
s.front() = 'h'; //引用作为左值,还原首元素为h
s.back() = 'd'; //引用作为左值,还原尾元素为d
cout << "s:" << s << endl;
const char *c = s.data();//将string对象转换为字符指针
cout << c << endl;
char *c1 = (char*)s.c_str();//将string对象转换为字符指针
cout << c1 << endl;
}
测试结果如下:
五、string对象的查找
s.find(args):查找s中args第一次出现的位置
s.rfind(args):查找s中args最后一次出现的位置
s.find_first_of(args):在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args):在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args):在s中查找第一个不在args中的字符
s.find_last_not_of(args):在s中查找最后一个不在args中的字符
注:
每个搜索函数的返回值类型都是string::size_type,表示匹配发生位置的下标。
若搜索失败,则返回一个名为string::npos的static成员,npos的类型为const string::size_type,初始值为-1。
测试代码如下:
void test5()
{
string name("AnnaBelle");
cout <<"n第一次出现的下标为:" <<name.find('n') << endl;
cout << "n最后一次出现的下标为:" << name.rfind('n') << endl;
cout << "nl中的任何一个字符在name中第一次出现的下标:" << name.find_first_of("nl")<<endl;
cout << "nl中的任何一个字符在name中最后一次出现的下标:" << name.find_last_of("nl") << endl;
cout << "name中第一个不在nl中的字符下标:" << name.find_first_not_of("nl") << endl;
cout << "name中最后一个不在nl中的字符下标:" << name.find_last_not_of("nl") << endl;
}
测试结果如下:
六、string对象的比较
注:s等于、大于或小于参数指定的字符串,s.compare分别返回0、正数或负数。
也可以使用关系运算符比较两个字符串大下:operator==,operator!=,operator<,operator>,operator>=,operator<=
operator+:用于连接两个字符串
七、数值转换
注:string参数中第一个非空白符必须是符号(+或-)或数字。也可以是以0x或0X开头的16进制数。对于字符串转换为浮点数的函数,string参数也可以以小数点(.)开头,并可以包含e或E来表示指数部分。
若string不能转换为一个数值,则这个函数会抛出invalid_argument的异常。若转换得到的数值无法用任何类型来表示,则抛出out_of_range异常。
如有异议可参考:https://zh.cppreference.com/w/cpp/string/basic_string
或者自行查看《C++ primer 5th》或与本人讨论。