一、string类
string类本不是一个基本的数据类型,也不是STL的容器,但是它与STL容器有着很多相似的操作。对于字符串的处理我们还可以用到char*,但是作为C++标准程序库中的string类,相较之下有着明显的优势,string类不必担心内存是否足够、字符串长度等等问题,而且作为一个类出现,他的成员函数足以满足我们大多数情况下的需要。我们尽可以把它看成是C++的基本数据类型。
二、string,cstring,string.h
在程序中使用string类型,我们必须包含 string 头文件。如下:
#include <string>
// 注意这里不是string.h,string.h是C语言中的字符串头文件
// 也不是cstring,cstring对应着string.h,是在改进之后为了兼容原c的string.h中的strlen,strcpy,strcat,strcmp……等功能而存在的,相当于string.h的升级版但是在C中不可用
三、string类中的部分成员函数
1)=, s.assign() // 赋以新值
2)swap() // 交换两个字符串的内容
3)+=, s.append(), s.push_back() // 在尾部添加字符
4)s.insert() // 插入字符
5)s.erase() // 删除字符
6)s.clear() // 删除全部字符
7)s.replace() // 替换字符
8)+ // 串联字符串
9)==,!=,<,<=,>,>=,compare() // 比较字符串
10)size(),length() // 返回字符数量
11)max_size() // 返回字符的可能最大个数
12)s.empty() // 判断字符串是否为空
13)s.capacity() // 返回重新分配之前的字符容量
14)reserve() // 保留一定量内存以容纳一定数量的字符
15)[ ], at() // 存取单一字符
16)>>,getline() // 从stream读取某值
17)<< // 将某值写入stream
18)copy() // 将某值赋值为一个C_string
19)c_str() // 返回一个指向正规C字符串(C_string)的指针 内容与本string串相同 有’\0’
20)data() // 将内容以字符数组形式返回 无’\0’
21)s.substr() // 返回某个子字符串
22)begin() end() // 提供类似STL的迭代器支持
23)rbegin() rend() // 逆向迭代器
24)get_allocator() // 返回配置器
25)s.find() // 在字符串中查找字符
这一部分分类参考了其他博客:p
1)赋以新值
=、s.assign():
string s, str = "war and peace";
s=str;//给s赋以新值str
s.assign(str); // 同上
s.assign(str,4,3); // s=“and”
s.assign(str,2,string::npos); // 把字符串str从索引值2开始到结尾赋给s
s.assign("newstr"); // 给s赋以新值newstr
s.assign("nico",5); // 把‘n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串
s.assign(5,'x'); // 把五个x赋给字符串
2)交换两个字符串的内容
s.swap():
例如:
string first( "first" );
string second( "second" );
first.swap( second );
此时first="second";second="first";
3)在尾部添加字符
+=:
string s="123";
s+=s;//则s="123123"
s.append():
string str1="I like C++";
string str2=",I like the world.";
string str3="Hello";
string str4("Hi");
str1.append(str2); //I like C++,I like the world.
str3.append(str2, 11, 7); //Hello World.
str4.append(5, '.'); //Hi.....
s.push_back():
C++中vector头文件中有push_back这一函数,作用是在vector尾部加入一个数据。string中也有这个函数,作用是在字符串结尾插入一个字符。
string s("12");
s.push_back('3');//s="123";
4)插入字符
s.insert():
s.insert(p0, *s);//在p0位置插入字符串s
s.insert(p0, *s, n);//在p0位置插入字符串s的前n个字符
s.insert(p0,s);//在p0位置插入字符串s
s.insert(p0,s, pos, n);//在p0位置插入字符串s从pos开始的连续n个字符
s.insert(p0, n, c);//在p0处插入n个字符c
5)删除字符
s.erase():
s.erase( pos );//删除pos指向的字符, 返回指向下一个字符的迭代器,
s.erase( start, end );//删除从start到end的所有字符, 返回一个迭代器,指向被删除的最后一个字符的下一个位置
s.erase( index, num );//删除从index索引开始的num个字符, 返回*this.
6)删除全部字符
s.clear():
等效于s.str("");
7)替换字符
s.replace():
s.replace( index, num, str; );//用str中的num个字符替换本字符串中的字符,从index开始
s.replace( index1, num1, str, index2, num2 );//用str中的num2个字符(从index2开始)替换本字符串中的字符,从index1开始,最多num1个字符
s.replace( index, num, *str );//用str中的num个字符(从index开始)替换本字符串中的字符
s.replace( index1, num1, *str, index2, num2 );//用str中的num2个字符(从index2开始)替换本字符串中的字符,从index1开始,num1个字符
s.replace( index, num1, num2, ch );//用num2个ch字符替换本字符串中的num1个字符,从index开始
s.replace( start, end, str );//用str中的字符替换本字符串中的字符,迭代器start和end指示范围
s.replace( start, end, *str );//用str中的字符替换本字符串中的字符,迭代器start和end指示范围
s.replace( start, end, *str, num );//用str中的num个字符替换本字符串中的内容,迭代器start和end指示范围,
s.replace( start, end, num, ch );//用num个ch字符替换本字符串中的内容,迭代器start和end指示范围.
8)串联字符串
+:
易理解不解释了
9)比较字符串
==,!=,<,<=,>,>=:
注意无论用哪种方法,顺序规则都是字典规则。也就是:
1.从前往后,逐位比较,第一个不同的字符,按照char的顺序比较(例如字母a小于字母b)
2.如果第一个字符串是第二个字符串的子列,例如“abc”和“abcde”,则前者小于后者
3.空字符串小于其它所有字符串
4.当且仅当字符串长度和每个位置上字符都相同,字符串相等
compare() :
int compare( str );//比较自己和str
int compare( *str );//比较自己和str
int compare( index, length, str );//比较自己的子串和str,子串以index索引开始,长度为length
int compare( index, length, str, index2, length2 );//比较自己的子串和str的子串,其中index2和length2引用str,index和length引用自己
int compare( index, length, *str, length2 );//比较自己的子串和str的子串,其中str的子串以索引0开始,长度为length2,自己的子串以index开始,长度为length
10)返回字符数量
size(),length() :
两者等效,返回字符串中的元素个数
11)返回字符的可能最大个数
max_size():
所能容纳的最大字符数目,这是系统或者库所实施的限制。但是不一定保证能达到该大小,有可能在还未达到该大小的时候,就已经无法继续分配任何的空间了。一般机器的string的max_size为4294967294。
12)判断字符串是否为空
s.empty():
判断是否为空是一个bool函数,当字符串为空时,返回true,否则返回false
13)返回重新分配之前的字符容量
s.capacity() :
STL容器的capacity属性,表示STL在发生realloc前能允许的最大元素数,也可以理解为预分配的内存空间。
当创建空容器时,容量(capacity)为 0;当用完时,增加原容量的 1/2 (各编译器 可能存在差异 vs2010是这样的,mingw则 增加原容量 )–适用如 vector这种元素连续存储的容器, 如为list则不同。
capacity 一般大于size的原因是为了避免每次增加数据时都要重新分配内存,所以一般会生成一个较大的空间,以便随后的数据插入。
14)保留一定量内存以容纳一定数量的字符
reserve():
为容器预留足够的空间,避免不必要的重复分配。预留空间大于等于字符串的长度。预留空间可以通过capacity()查看。
string str = "April";
str.reserve(20);// str的预留空间为15。
resize():
直接改变字符串的长度,小于原本长度尾巴被截掉,大于则默认空字符填充。
15)存取单一字符
[ ],at():
按给定索引值(数组下标)返回字符
16)从stream读取某值 and 17)将某值写入stream
>>,getline() ,<<:
字符串流stringstream操作
iostream标准库支持内存中的输入输出,只要将流与存储在程序内存中的string对象捆绑起来即可。此时,可使用iostream输入和输出操作符读写这个stream对象。使用stringstream,我们必须包含头文件#include<sstream>
。
1) >>操作符 // 用于从istream对象中读入输入
2) is >> s; // 从输入流is中读取一个以空白字符分割的字符串,写入s
3) <<操作符 // 用于把输出写到ostream对象中
4) os << s; // 将s写到输出流os中
5) getline(is, s); // 从输入流is中读取一行字符,写入s,直到遇到分行符或到了文件尾
6) istream // 输入流 提供输入操作
7) ostream // 输出流 提供输出操作
18)将某值赋值为一个C_string
c_string理解成c风格的字符串,即char指针字符串
copy():
copy可以拷贝一段范围,然后粘贴到一个迭代器里
copy(mystring, mystring + n, myvector.begin());
拷贝mystring里n个字符,再粘贴到 myvector里
19)返回一个指向正规C字符串(C_string)的指针,内容与本string串相同,有’\0’
c_str():
生成一个const char*指针,指向以空字符终止的数组。
因为c_str()返回的只是一个指向某字符串的指针,因此要么现用先转换,要么把它的数据复制到用户自己可以管理的内存中
int main()
{
const char* c;
string s="1234";
c = s.c_str();
cout<<c<<endl; //输出:1234
s="abcd";
cout<<s<<endl; //输出:abcd
return 0;
}
可以使用strcpy等函数把需要的数据拷贝到另一个内存中,就能独立开来。
int main()
{
char* c=new char[20];
string s="1234";
//c = s.c_str();
strcpy(c,s.c_str());
cout<<c<<endl; //输出:1234
return 0;
}
c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。
20)将内容以字符数组形式返回,无’\0’
data():
data()与c_str()类似,但是返回的数组不以空字符终止。
C++中的字符串就不是以’\0’结尾的。
21)返回某个子字符串
s.substr():
s.substr(); // 返回s的全部内容
s.substr(11); // 从索引11往后的子串
s.substr(5,6); // 从索引5开始6个字符
22)提供类似STL的迭代器支持
c.begin():
返回指向容器最开始位置数据的指针
c.end():
返回指向容器最后一个数据单元+1的指针
如果我们要输出最后一个元素的值应该是 *(- - c.end());
23)逆向迭代器
rbegin():
rbegin()指向最后一个,end()指向最后一个元素的下一个,所以不等;
rend():
rend()指向第一个元素,begin()指向第一个元素,所以相等。
24)返回配置器
get_allocator():
空间配置器,用于实现内存的动态分配与释放.new和delete申请与释放内存的开销是比较大的。如果多次new与delete会使程序的效率大大降低。这时开发者很聪明,定义了一个allocator来实现内存的管理。
25)在字符串中查找字符
s.find():
s.find( str, index );//返回str在字符串中第一次出现的位置(从index开始查找)。如果没找到则返回string::npos,
s.find( *str, index );//返回str在字符串中第一次出现的位置(从index开始查找)。如果没找到则返回string::npos,
s.find( *str, index, length );//返回str在字符串中第一次出现的位置(从index开始查找,长度为length)。如果没找到就返回string::npos,
s.find( ch, index );//返回字符ch在字符串中第一次出现的位置(从index开始查找)。如果没找到就返回string::npos
s.rfind():
逆向查找
s.rfind( c, pos ) ;//从pos开始从后向前查找字符c在当前串中的位置
s.rfind(*s, pos ) ;
s.rfind(*s, pos, n ) ;
s.rfind( s, pos ) ;
//从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string::npos的值