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. 自动化构建工具maven

    Maven是目前最流行的自动化构建工具,对于生产环境下多框架.多模块整合开发有重要作用.Maven 是一款在大型项目开发过程中不可或缺的重要工具. 一.什么是构建? 构建并不是创建,创建一个工程并不等 ...

  2. Fedora14 mount出现错误时解决办法【亲测有效】

    挂载时出现了如上图所示问题,看第一条英语提示,我刚开始以为是文件权限不够,改了权限之后,依旧存在这样的问题, 于是,我上网查阅了一些资料: 在解决之前,先让我们一起来了解一下nfs: NFS最大功能就 ...

  3. socket编程(一)

    因为下载器涉及到socket的知识,就花了一天学习了.因为时间原因分成几部分.(这里记录上的是基于Windows平台的) #include <stdio.h> #include <w ...

  4. windows下端口转发 netsh

    添加映射表: netsh interface portproxy add v4tov4 listenport=(监听端口) connectaddress=(虚机IP) connectport=(虚机端 ...

  5. nginx虚拟主机配置和反向代理

    虚拟主机有三种配置方式(常用于本机测试使用,将一个ip和端口的请求根据域名不同分配到不同的应用服务器) 基于ip 不常用 基于端口 可选 基于域名 可选 #user nobody; worker_pr ...

  6. HDU 4635 —— Strongly connected——————【 强连通、最多加多少边仍不强连通】

    Strongly connected Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  7. HDU 5360——Hiking——————【贪心+优先队列】

    Hiking Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  8. Access 2010入门、语文

    Access2010入门 数据管理库是按照数据结构来组织,存储和管理数据的仓库. 最早出现的数据库是网状DBMS 1970年,EFCodd博士提出关系模型的概念,提出关系模型的理论基础. SQL语言功 ...

  9. 应该知道的一些Markdown语法

    目录 快速输入标题 斜体和粗体,删除线 分隔线 外链接 无序列表 有序列表 定义型列表 插入图片 文字引用 标签分类 表格 行内代码块 代码段 注脚 待办事宜 Todo 列表 显示当前文章的目录 快速 ...

  10. UrShop 商城系统介绍

    UrShop能够帮助企业快速构建个性.高效.稳定.安全的网上商城并减少二次开发带来的成本.对于网店来说,UrShop除了安装便捷,功能上强大以外,操作上也非常方便快捷.优社电商秉承设身处地为客户着想的 ...