string基本字符容器

C语言只提供一个char类型用来处理字符串,而面对字符串,只能通过数组来处理,显得非常不方便。C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,它提供添加,删除,替换,查找和比较等丰富的方法。
虽然使用vector这样的向量也可以处理字符串,但功能比不上string。向量元素类型是string,如vector这样的向量也可以处理字符串。
使用string容器,需要头文件包含声明

#include<string>

创建string对象

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    cout << s.length() << endl;
    return 0;
}     

给string对象赋值

第一种方法直接赋值

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "hello,C++STL!";
    cout << s << endl;

    return 0;
}       

更常用的一种方法是,把字符指针赋给一个字符串对象:

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    char ss[5000];
    //scanf的输入速度比cin快的多
    //scanf是C语言的函数,不支持string对象
    scanf("%s",&ss);
    s = ss;

    cout << s << endl;
    return 0; 
}  

从string对象的尾部添加一个字符(char),采用“+”操作符即可,具体应用如下:

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = s + 'a';
    s = s + 'b';
    s = s + 'c';
    cout << s << endl;
    return 0; 
}    

好像java中对字符串也有这种+的操作

从string对象尾部追加字符串
(1)直接采用“+”操作数,代码如下:

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = s + "abc";
    s = s + "123";
    cout << s << endl;

    return 0;
}          

(2)采用append()方法,代码如下:

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s.append("abc");
    s.append("123");
    cout << s << endl;

    return 0;
}       

感觉append似曾相识,Python中曾用到

访问string对象的元素,下标是从0开始计数的,另外,string对象的元素是一个字符(char),这点一定要清楚。代码如下

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "abcd123456";
    cout << s[0] <<endl;
    cout << s[0] - 'a' << endl;
    return 0;
}     

删除string对象的元素
(1)清空一个字符串,则直接给它赋空字符串即可。
(2)使用erase()方法删除迭代器所指的那个元素或那个区间中的所有元素。代码如下

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "abc123456";
    string::iterator it=s.begin();
    s.erase(it+3);
    cout << s << endl;
    s.erase(it,it+4);
    cout << s << endl;
    s = "";
    cout <<s.length() << endl;
    return 0;
}         

可以使用insert()方法把一个字符插入到迭代器位置之前(特别注意是之前),代码如下:

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "123456";

    string::iterator it;
    it = s.begin();
    s.insert(it+1,'p');
    cout << s << endl;

    return 0;
}  

采用length()方法可返回字符串的长度:采用empty()方法,可返回字符串是否为空,如果字符串为空,则返回逻辑真,即1,否则,返回逻辑假。代码如下:
是否为空 1 是 为空
0 不是 空

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "abc123456";
    cout << s.length() << endl;
    s = "";
    cout << s.empty() << endl;

    return 0;
}

替换string对象字符串
使用replace()方法可以方便地替换string对象中的字符,replace()方法的重载函数相当多,常用的只有一个,具体代码如下:

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "abc123456";
    s.replace(3,3,"good");
    cout << s << endl;

    return 0;
}    

从第三个开始,将连续的3个字符串替代为“good”
即将abc之后的三个字符替代为“good”

搜索string对象的元素或者子串
search
采用find()方法可查找字符串中的第一个字符元素(char,用单引号界定),或者子串(用双引号界定),如果查到,则返回下标值(从0开始计数),如果查不到,则返回429467295
find()方法有多种重载函数,下面的代码,仅列举了一种用法

#include<iostream>
#include<string>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "cat dog cat";
    //查找第一个字符'c',返回下标值  
    cout << s.find('c') << endl; 
    //查找第一个字符子串
    cout << s.find("c") << endl;
    //查找第一个子串"cat",返回下标值
    cout << s.find("cat") << endl;
    //查找第一个子串"dog",返回下标值
    cout << s.find("dog") << endl;
    //查找第二个子串"dogc",查不到则返回4294967295
    cout << s.find("dogc") << endl; 

    return 0; 
} 

string对象可以使用compare()方法比较与其他字符串相比,如果它比对方大,则返回1,如果它比对方小,则返回-1,如果它与对方相同,则返回0,代码如下:

#include<string>
#include<iostream>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "cat dog cat";
    //s 比 "cat" 字符串大,返回1 
    cout << s.compare("cat") << endl;
    //s 与 "cat dog cat"相等,返回0
    cout << s.compare("cat dog cat") << endl;
    //s 比 "dog" 小 返回-1
    cout << s.compare("dog") << endl;

    return 0; 
}

用reserve()方法可将string对象迭代器所指向的一段区间中的元素(字符)反向排序。reserve()方法需要声明头文件 algorithm

#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

int main(int argc,char * argv[])
{
    string s;
    s = "123456789";
    reverse(s.begin(),s.end());
    cout << s << endl;
    return 0;
}

string对象可以作为vector向量的元素,这种用法,类似于字符串数组。代码如下
相当于是一个多维数组

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int main(int argc,char * argv[])
{
    vector<string> v;
    v.push_back("Jack");
    v.push_back("Mike");
    v.push_back("Tom");
    cout << v[0] << endl;
    cout << v[1] << endl;
    cout << v[2] << endl;
    cout << v[0][0] << endl;
    cout << v[1][0] << endl;
    cout << v[2].length() << endl;

    return 0;
} 

这点很重要!!!
在ACM竞赛中,常常需要将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会很长,这时候,我们就可以将读入的数据当作字符串来处理,这样就方便,而且省时多了。下面这个程序演示了一个求一个整数各位的和
思想:用字符串来表示整数用小标来访问每位数。

这里写代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值