#C++基础学习总结----string详解

一、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的值 

持续更新··················

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值