C++ STL之字符串容器string用法详解

来源:互联网 发布:最近的网络流行词 编辑:程序博客网 时间:2024/05/22 08:05

C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,他提供了添加删除,替换,查找和比较等丰富的方法;

 

虽然使用vector<string> 这样的向量也可以处理字符串,但功能比不上string。向量的元素类型可以是string,如vector<string>这样的向量,实际上就类似于C语言中的字符串数组;

 

使用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;

}

 

The result of the program is : 0

 

***给string对象赋值***

一般有两种方式:

1>. 直接给字符串对象赋值;

Like This 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "Hello, c++STL!";

    cout << s << endl;

    return 0;

}

 

2>.更常用的方法是把字符指针赋给一个字符串对象

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s;

    char ss[200];

    cin >> ss;

    s = ss;

    cout << s << endl;

    return 0;

}

 

 

***尾部追加一个字符***

string尾部追加一个字符(char), 采用+操作符即可

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s;

    s += 'a';

    s += 'b';

    s += 'c';

    cout << s << endl;

    return 0;

}

Output : abc

 

***尾部追加字符串***

一般有两种方法:

1>. 直接采用+操作符;

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s;

    s += "abc";

    s += "123";

    cout << s << endl;

    return 0;

}

Output : abc123

 

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

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s;

    s.append("abc");

    s.append("123");

    cout << s << endl;

    return 0;

}

 

***访问string对象的元素***

一般使用下标的方式随机访问string对象的元素下标是从0开始计数的另外,string对象元素是一个字符(char), 这点一定要清楚

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "abc123456";

    cout << s[0] << endl;  //输出对象的首元素

    cout << s[0] - 'a' << endl;  //两个相等的字符相减为0;

    return 0;

}

 

***删除string对象的元素***

1>. 清空一个字符串则直接给他赋空字符串即可

2>. 使用erase()方法删除迭代器所指的那个元素或一个区间的所有元素代码如下

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "abc123456";

    string::iterator it = s.begin();  //定义迭代器变量指向字符串对象首元素

    s.erase(it+3);   //删除第三个元素元素从位置0开始计数

    cout << s << endl;

    s.erase(it, it+4);  //删除区间[0, 4)内所有元素的值

    cout << s << endl;

    s = "";   //清空字符串或者直接用s.clear()

    cout << s.length() << endl;  //输出字符串的长度

    return 0;

}

 

不定义迭代器也可以直接用s.begin()表示

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "abc123456";

    s.erase(s.begin()+3);   //删除第三个元素元素从位置0开始计数

    cout << s << endl;

    s.erase(s.begin(), s.begin()+4);  //删除区间[0, 4)内所有元素的值

    cout << s << endl;

    s = "";   //清空字符串;

    cout << s.length() << endl;  //输出字符串的长度;

    return 0;

}

 

运行结果:

abc23456

3456

0

 

注意:删除某区间内的所有元素,删除的元素是前开后并,如s.erase(it, it+4) 删除的元素是下标小于4且下标大于等于0的所有元素;

 

 

 

****判断是否为空****

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

 

代码如下:

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "abc123456";

    cout << s.length() << endl;

    cout << s.empty() << endl;

    s.clear(); //或者是 s = "";

    cout << s.empty() << endl;

    return 0;

}

运行结果

9

0

1

 

 

****给string对象插入字符****

可以使用insert()方法插入到迭代器位置之前代码如下

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "123456";

    string::iterator it = s.begin();  //定义一个迭代器,也可以不定义;

    s.insert(it+1, 'k');  //把字符k插入到第一个字符的前面(注意,字符位置是从0开始计数的)

    s.insert(s.begin()+2, 'a');  把字符'a'插入到第二个元素的前面;

    s.insert(s.end(), 'y');  //把字符'y'插入到最后一个字符的后面;

    cout << s << endl;

    return 0;

}

运行结果:1ka23456y

 

 

 

****替换string对象字符****

 

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

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "abc123456";

    s.replace(3, 3, "Kesha");  //从第三个开始将连续的3个字符替换成Keshaabc换成Kesha;

    cout << s << endl;

    return 0;

}

运行结果:abcKesha456

 

 

 

 

****搜索string对象的元素或子串****

 

     采用find()方法可查找字符串中第一个字符元素(char, 用单引号界定),或者子串(用双引号界定),如果查到,则返回其下标值(从0开始计数),如果查不到,则返回4294967295;

     find()方法有很多重载函数,下面的代码只是其中一种用法:

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "cat dog cat";

 

    cout << s.find('c') << endl; //查找第一个字符'c',返回其下标值;

 

    cout << s.find('d') << endl; // 查找第一个字符'd',返回其下标值;

 

    cout << s.find("c") << endl;  //查找第一个子串"c",返回其下标值;

 

    cout << s.find("cat") << endl; //查找第一个子串"cat",返回其下标值;

 

    cout << s.find("dog") << endl; //查找第一个子串"dog",返回其下标值;

 

    cout << s.find("dogc") << endl;  //查不到返回4394967295

 

    return 0;

}

 

运行结果:

0

4

0

0

4

4394967295

 

 

 

****reverse反向排序string对象的元素****

 

采用reverse()函数可将string对象迭代器所指向的一段区间中的元素(字符)反向排序,reverse()方法必须包含头文件include <algorithm>; 代码如下

 

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s = "0123456789";

    reverse(s.begin(), s.end());

    cout << s << endl;

    return 0;

}

运行结果: 9876543210

 

 

 

**** string对象作为vector元素****

 

string对象可以vector向量的元素这种用法类似于字符串数组代码如下

 

#include <iostream>

#include <string>

#include <vector>

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;

}

 

运行结果:

Jack

Mike

Tom

J

M

3

 

 

 

 

**** string类型数字化处理****

 

在ACM比赛中,常常需要将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会太长,这时候,我们可以将读入的数据当成字符串来处理,这样就方便了很多,省时了很多,下面这个程序主要功能是求出一个整数各位的和;

 

#include <iostream>

#include <string>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s;

 

    while(cin >> s) {

        int sum = 0;

        for(int i=0; i<s.length(); i++) {

            if(s[i] == '1') sum += 1;

            else if(s[i] == '2') sum += 2;

            else if(s[i] == '3') sum += 3;

            else if(s[i] == '4') sum += 4;

            else if(s[i] == '5') sum += 5;

            else if(s[i] == '6') sum += 6;

            else if(s[i] == '7') sum += 7;

            else if(s[i] == '8') sum += 8;

            else if(s[i] == '9') sum += 9;

        }

        cout << sum << endl;

    }

    return 0;

}

 

Sample Input: 1234059

Sample Output: 24

 

当然有更加直接的办法将数字字符转换为数字

for(int i=0; i<s.size(); i++) {

     sum += (s[i]-'0');

}

此代码与上述for循环的功能一样都是求一串数字各位的和

 

 

 

 

**** string对象与sscanf函数****

 

在c语言中,sscanf函数很管用,他可以把一个字符串按你需要的方式分理出子串,甚至是数字,下面这个程序演示了sscanf函数的具体用法:

 

运行结果为:

abc <> 123 <> pmc

abc >< 123 >< pmc

1 & 2 & 3

4 ~ 5 ~ 6

 

#include <iostream>

#include <string>

#include <cstdio>

using namespace std;

 

int main(int argc, char *argv[])

{

    string s1, s2, s3;

    char sa[100], sb[100], sc[100];

    //将字符串分离成子串,分隔符为空格;

    sscanf("abc 123 pmc", "%s %s %s", sa, sb, sc);

    cout << sa << " <> " << sb << " <> " << sc << endl;

    s1 = sa, s2 = sb, s3 = sc;

    cout << s1 << " >< " << s2 << " >< " << s3 << endl;

    //将字符串分离成数字,分隔符为空格;

    //当用到数字的时候,跟scanf一样,他要传递指针地址;

    int a, b, c;

    sscanf("1 2 3", "%d %d %d", &a, &b, &c);

    cout << a << " & " << b << " & " << c << endl;

    //将字符串分离成数字,分隔符为,$;

    //当用到数字的时候,跟scanf一样,他要传递指针地址;

    int x, y, z;

    sscanf("4, 5$6", "%d,%d$%d", &x, &y, &z);

    cout << x << " ~ " << y << " ~ " << z << endl;

    return 0;

}

原创粉丝点击