string基本字符系列容器
C语言只提供了一个插入类型用来处理字符, 而对于字符串, 只能通过字符串数组来处理, 显得十分不便. C++STL提供了string基本字符系列容器来处理字符串, 可以把string理解为字符串类, 它提供了添加, 删除, 替换, 查找和比较等丰富的方法.
 
虽然使用vector<char>这样的向量也可以处理字符串, 但功能比不上string. 向量的元素类型可以是string, 如vector<string>这样的向量, 实际上就类似于C语言中的字符串数组.
 
使用string容器, 需要头文件包含声明"#include<string>"
 
1.1创建string对象
下面这条语句创建了字符串对象s, s是一个空字符串, 其长度为0:
#include<iostream>
#include<string>
using namespace std;
 
int main()
{
    string s;
    cout << s.length() << endl;
    return 0;
}
 
1.2给string对象赋值
给string对象赋值一般有两种方式
(1)直接给字符串对象赋值, 如:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "hello, C++STL.";
    cout << s << endl;
    return 0;
}
 
(2)更常用的方法是, 把字符指针赋给一个字符串对象:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    char ss[5000];
    //scanf的输入速度比cin快得多
    //scanf是C语言的函数, 不支持string对象
    scanf("%s", &ss);
    //把整个字符数组赋值给string对象
    s = ss;
    //输出字符对象
    cout << s << endl;
    return 0;
}
 
1.3从string对象尾部添加字符
在string对象的尾部添加一个字符(char), 采用"+"操作符即可, 具体应用如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = s + 'a';
    s = s + 'b';
    s = s + 'c';
    cout << s << endl;
    return 0;
}
 
1.4从string对象尾部追加字符串
从尾部追加的方式有两种
(1)直接采用"+"操作符, 代码如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = s + "abc";
    s = s + "123";
    cout << s << endl;
    return 0;
}  
(2)采用append()方法, 代码如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s.append("abc");
    s.append("123");
    cout << s << endl;
    return 0;
}  
 
1.5给string对象插入字符
可以使用insert()方法把一个字符插入到迭代器位置之前, 代码如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "123456";
    //定义迭代器
    string::iterator it;
    //迭代器位置为字符串首
    it = s.begin();
    //把字符'p'插入到第一个字符前(注意, 字符位置是从0开始计数)
    s.insert(it + 1, 'p');
    cout << s << endl;
    return 0;
}  
 
1.6访问string对象的元素
一般使用下标方式随机访问string对象的元素, 下标是从0开始计数的. 另外, string对象的元素是一个字符(char), 这一点一定要清楚. 代码如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "abc123456";
    //输出string对象的首元素
    cout << s[0] << endl;
    //两个相同的字符相减值为0
    cout << s[0] - 'a' << endl;
    return 0;
}  
 
1.7删除string对象的元素
(1)清空一个字符串, 则直接给它赋空字符串即可.
(2)使用erase()方法删除迭代器所指的那个元素或一个区间中的所有元素. 代码如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "abc123456";
    //定义迭代器变量, 指向字符串对象的首元素
    string::iterator it = s.begin();
    //删除第3个元素, 元素位置从0开始计数
    s.erase(it + 3);
    cout << s << endl;
    //删除0~4区间的所有元素
    s.erase(it, it + 4);
    cout << s << endl;
    //清空字符串
    s = "";
    //输出字符串的长度
    cout << s.length() << endl;
    return 0;
}  
 
1.8返回string对象的长度
采用length()方法可返回字符串的长度; 采用empty()方法, 可返回字符串是否为空, 如果字符串为空, 则返回逻辑真, 即1, 否则, 返回逻辑假, 即0. 代码如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "abc123456";
    //输出字符串的长度
    cout << s.length() << endl;
    //清空字符串
    s = "";
    //判断字符串是否为空
    cout << s.empty() << endl;
    return 0;
}  
 
1.9替换string对象的字符
使用replace()方法很方便的替换string对象中的字符, replace()方法的重载函数相当多, 常用的只有一两个, 具体代码如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "abc123456";
    //从第3个开始, 将连续的3个字符替换为"good"
    //即将"abc"替换为"good"
    s.replace(3, 3, "good");
    cout << s << endl;
    return 0;
}  
/*
abcgood456
*/
 
1.10搜索string对象的元素或字串
采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定), 如果查到, 则返回下标值(从0开始计数), 如果查不到, 则返回4294967295.
find()方法有很多重载函数, 下面的代码, 仅举出了一种用法.
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "cat dog cat";
    //查找第一个字符'c', 返回下标值
    cout << s.find('c') << endl;
    //查找第一个子串"c", 返回下标值
    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;
}
 
/*
0
0
0
4
18446744073709551615
*/
 
1.11string对象的比较
string对象可以使用compare()方法与其他字符串相比较. 如果它比对方大, 则返回1(整数); 如果它比对方小, 则返回-1(负数); 如果它与对方相等, 则返回0. 代码如下:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    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;
}
/*
8
0
-1
*/
 
1.12用reverse反向排序string对象
采用reverse()方法可将string对象迭代器所指向的一段区间中的元素(字符)反向排序.
reverse()方法需要声明头文件"#include<algorithm>". 代码如下:
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "123456789";
    reverse(s.begin(), s.end());
    cout << s << endl;
    return 0;
}
 
/*
987654321
*/
 
1.13string对象作为vector元素
string对象可以作为vector向量的元素, 这种用法, 类似于字符串数组, 代码如下:
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
 
int main()
{
    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
*/
 
1.14string类型的数字化处理
在ACM竞赛中, 常常需要将读入的数字的每位分离出来, 如果采用取余的方法, 花费的时间就会很长, 这时候, 我们可以将读入的数据当成字符串来处理, 这样就方便, 省时多了, 下面这个程序演示了求一个整数各位的和:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    s = "123456789";
    int i;
    int sum = 0;
    for(i = 0; i < s.length(); ++i)
    {
        if(s[i] == '0') sum += 0;
        else 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;
}
/*
45
*/
 
1.15string对象与字符数组互操作
下面这个程序演示了字符数组与string对象的输入与输出:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s;
    char ss[100];
    //输入字符串到字符数组中
    scanf("%s", &ss);
    //字符数组赋值给字符串对象
    s = ss;
    //用printf输出字符串对象, 要采用c_str()方法
    printf(s.c_str());
    cout << endl;
    printf("%s", ss);
    cout << endl;
    cout << s << endl;
    cout << ss << endl;
    return 0;
}
/*
input:
abc123
 
output:
abc123
abc123
abc123
abc123
*/
 
1.16string对象与sscanf函数
在C语言中, sscanf函数很管用, 它可以把一个字符串按你需要的方式分离出子串, 甚至是数字
下面这个程序演示了sscanf函数的具体用法:
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    string s1, s2, s3;
    char sa[100], sb[100], sc[100];
    //将字符串分离成子串, 分隔符为空格
    sscanf("abc 123 pc", "%s %s %s", sa, sb, sc);
    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;
}
 
/*
abc 123 pc
1 2 3
4 5 6
*/
 
1.17string对象与数值相互转换
有时候, string对象与数值之间需要相互转换, 下面这个例子详细说明了如何完成该工作的:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
 
//C++方法: 将数值转换为string
string convertToString(double x)
{
    ostringstream o;
    if(o << x)
        return o.str();
    return "conversion error";//if error
}
 
//C++方法: 将string转换为数值
double convertFromString(const string &s)
{
    istringstream i(s);
    double x;
    if(i >> x)
        return x;
    return 0.0;//if error
}
 
int main()
{
    //将数值转换为string的第一种方法: C方法
    char b[10];
    string a;
    sprintf(b, "%d", 1975);
    a = b;
    cout << a << endl;
    
    //将数值转换为string的第二种方法: C++方法
    string cc = convertToString(1976);
    cout << cc << endl;
    
    //将string转换为数值的方法: C++方法
    string dd = "2006";
    int p = convertFromString(dd) + 2;
    cout << p << endl;
    
    return 0;
}
 
/*
1975
1976
2008
*/

C++之string基本字符系列容器的更多相关文章

  1. string基本字符系列容器(一)

    C++STL提供了string基本字符系列容器来处理字符串,可以把string理解成字符串类,它提供了添加,删除,替换,查找和比较等丰富的方法. 使用string容器,需要头文件包含声明#includ ...

  2. string基本字符系列容器(二)

    string对象作为vector元素 string对象可以作为vector向量元素,这种用法类似字符串数组. #include<string> #include<vector> ...

  3. string基本字符序列容器(竞赛时常用的使用方法总结)

    C语言只提供了一个char类型用来处理字符,而对于字符串,只能通过字符串数组来处理,而C++STL提供了string基本字符序列容器来处理字符串,可以将其理解为字符串类,它提供了添加,删除,替换.查找 ...

  4. JAVA基础5——与String相关的系列(1)

    与String相关的系列 String, 是JAVA中常见的一个引用类型,且其具有一定的特殊性. String类型被设置为final型,即不可继承,也就不可修改其中的实现. String可以改变吗 S ...

  5. Android:认识R类、findViewById方法查找组件、@string查找字符、@color查找颜色、@drawable查找图片、@dimen某个组件尺寸定义、项目引入资源国际化

    导入 之前都是断断续续的看了一些于如何使用android开发的文章.资料等,到目前位置很多基础的东西都不清楚,于是去学习了别人的课程,才了认识了R类.findViewById方法查找组件.项目引入资源 ...

  6. 字符串的比较【string和字符数组】

    无论是string 还是 字符数组的字符串比较函数,返回的都是字典序的大小.如 1234 和 5 比较时就是1234的字典序小于5,要想比较字符串表示的数字的大小,需要自己写函数比较

  7. C++string,char* 字符数组,int类型之间的转换

    string.int 常见类型之间相互转换 int & string 之间的转换 C++中更多的是使用流对象来实现类型转换 针对流对象 sstream实现 int,float 类型都可以实现 ...

  8. Docker深入浅出系列 | 容器初体验

    目录 Docker深入浅出系列 | 容器初体验 教程目标 预备工作 容器与虚拟化技术 什么是Docker 为什么要用Docker 事例 什么是容器镜像和容器 容器与虚拟机的区别 Vagrant与Doc ...

  9. Docker深入浅出系列 | 容器数据持久化

    Docker深入浅出系列 | 容器数据持久化 Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会 ...

随机推荐

  1. python练习六十五:类的使用实例

    代码: class human(): #定义基类,包括属性和方法 def __init__(self,name,eye=2,age=98,city='陕西'): #属性值有四个,分别为name,eye ...

  2. Java学习笔记day05_方法重载

    1.方法的重载overload 在同一个类中, 允许出现同名的方法, 只要方法的参数列表不同即可. 参数列表不同: 参数个数不同, 参数类型不同, 顺序不同. public class MethodO ...

  3. vue 组件之间数据传递(七)

    1.props:父组件 -->传值到子组件 app.vue是父组件 ,其它组件是子组件,把父组件值传递给子组件需要使用 =>props 在父组件(App.vue)定义一个属性(变量)sex ...

  4. vue环境搭建(一)

    1.Vue依赖node npm命令执行,需要下载node 下载地址 2.安装全局vue-cli脚手架(搭建环境所需要模板),  window+ r 打开命令工具,输入cmd  ,这时显示命令行工具,输 ...

  5. JavaSE---多线程---线程的生命周期

    1.线程的生命周期:新建.就绪.运行.阻塞.死亡 2.运行状态线程进入阻塞: 1.1 调用sleep方法主动放弃: 1.2 调用线程的suspend方法将线程挂起,不推荐使用: 1.3 线程调用一个阻 ...

  6. Mybatis学习笔记9 - 鉴别器discriminator

    鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为. 示例如下: DeptmentMapper接口定义: package com.mybatis.dao ...

  7. python处理编码问题和JSON格式

    从文件读出数据:默认utf8编码 json.dumps()输出数据:默认unicode编码 json读取(json是种通用的数据传输格式) import ujson as json #for perf ...

  8. maya 安装失败

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  9. 怎么查找Linux系统调用

    目前都是这么找: git grep SYSCALL_DEFINE | grep signal系统调用的函数名本来是叫sys_xxx,现在都是用宏SYSCALL_DEFINE(XXX),搞得无法找到sy ...

  10. (转)轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...