2.2 string基本字符系列容器——>要包含string库“include<string>”
相当于字符串类,亦可用vector<char>处理字符串,但功能比不上string,或者vector<string>,相当于c语言中的字符串数组。
1.创建string对象
类似于用普通数据类型,定义变量一般。
创建字符串对象时,该字符串是个空字符串,其长度为0。如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
cout << s.length() << endl ;
return 0;
}
运行结果是:0
2.两种方式给string对象赋值
(1)用赋值号直接赋值
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s="Hello world!!!";
cout << s << endl ;
return 0;
}
运行结果:
Hello world!!!
(2)更常用的方法是,把字符指针赋给一个字符串对象
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
char ss[5000];
//scanf的输入速度比cout快得多
//scanf是C语言中的函数,所以不支持string对象
scanf("%s",&ss);
//将整个字符数组赋值给string对象
s=ss;
cout << s << endl ;
return 0;
}
3.从string对象尾部添加 字符(char),采用“+”操作即可。
4.从string对象尾部追加字符串
(1)直接运用“+”操作符
(2)采用append()方法,是类之中的成员函数。<对象>.append(<追加的值参数>);
如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s="Hello";
s=s+" ";
s.append("world");
s=s+"!!!";
cout << s << endl;
return 0;
}
5.给string对象插入字符,可用insert()方法插到迭代器的位置之前,是类之中的成员函数。<对象>.insert(<位置参数>,<插入的值>);
如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s="Hello";
s=s+" ";
s.append("world");
s=s+"!!!";
string::iterator it; /*相当于指针,string之中属性的定义变量*/
it = s.begin();
s.insert(it+1,'3');
cout << s << endl;
return 0;
}
6.运用下标方式随机访问string对象的元素,下标是从0开始计数的。另外,string对象的元素是一个个字符。此时相当于字符串数组。
如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s="Hello";
s=s+" ";
s.append("world");
s=s+"!!!";
string::iterator it; /*相当于指针,string之中属性的定义变量*/
it = s.begin();
s.insert(it+1,'3');
cout << s << endl;
cout << s[1] << endl ;
return 0;
}
7.删除string对象的元素
(1)清空一个字符串,则直接给他赋空字符串即可;
(2)使用erase()方法删除迭代器所指的那个元素或者一个区间中的所有元素。已对该函数进行过了重载,所以
<对象>.erase(<所要删除位置的元素的值>);或者<对象>.erase(<所要删除区间的起始元素的值>,<所要删除的元素的最后元素的后一个位置上的元素>);
如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s="Hello";
s=s+" ";
s.append("world");
s=s+"!!!";
string::iterator it; /*相当于指针,string之中属性的定义变量*/
it = s.begin();
s.insert(it+1,'3');
cout << s << endl;
cout << s[1] << endl ;
s.erase(it+1);//相当于s.erase(it+1,it+2);
cout << s << endl;
s.erase(it+1,it+4);
cout << s << endl;
return 0;
}
8.返回string对象的长度
采用length()方法返回字符串的长度;
采用empty()方法返回判断字符串是否为空的结果。(空为真,1;不空为假,0.)
9.替换字符——>replace()方法,重载很多。
<对象>.replace(<起始元素位置>,<从开始元素以后的所替换的元素个数>,<要执行的替换进去的字符串(个数可大可小,不限)>);
10.搜索string对象的元素与子串,find()方法。
采用find()方法可查找字符串中的第一个字符元素(char,用单引号界定)或者子串(用双引号界定,返回第一个元素的下标值),如果查到,这返回下标值(从0开始计数),如果查不到,则返回4294967295.
11.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;
}
12.用reverse反向排序string对象
使用reverse反向排序算法,该函数包含于“#include<algorithm>”.
reverse(v.begin(),v.end());//头指针到尾指针
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string s;
s = "123456789";
reverse(s.begin(),s.end());
cout << s << endl ;
return 0;
}
13.string对象可以作为vector向量的元素,类似于字符串数组。
14.string类型的数字化处理
在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;
}
15.string对象鱼字符串数组的相互操作
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
char ss[100];
//输入字符串到字符数组中
scanf("%s",&ss);
//字符数组赋值给字符串数组
s=ss;
//因为字符串数组不能使用scanf()和printf()函数
//若要用printf输出字符串对象,要使用c_str()方法
printf(s.c_str());
cout << endl ;
//用printf输出字符数组
printf("%s",ss);
cout << endl ;
cout << s << endl ;
cout << ss << endl ;
return 0 ;
}
16.string对象与sscanf函数
在C语言中,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,d;
sscanf("3 4,5$6","%d %d,%d$%d",&a,&b,&c,&d);
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
return 0;
}
17.string对象与数值之间需要相互转换。
#include<string>
#include<iostream>
#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;
}
相关推荐
通过上述内容的学习,我们了解到STL泛型编程为C++开发提供了强大的工具箱。掌握STL不仅可以提高编程效率,还能帮助开发者写出更加优雅、高效的代码。未来随着C++语言的发展,STL还将不断进化和完善,为程序员带来更...
STL的核心优势在于其高度的通用性和效率,这些特性使得它成为现代C++编程不可或缺的一部分。 #### 数据结构与算法分离 STL的一个显著特点是实现了数据结构和算法的彻底分离。这意味着用户可以自由地选择不同的数据...
在C++编程语言中,泛型编程和模板是两个核心概念,它们极大地提升了代码的复用性和灵活性。本文将深入探讨这两个主题,并结合源码分析,帮助你更好地理解和应用它们。 ## 泛型编程 泛型编程是C++中一种抽象编程的...
C++ STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它为程序员提供了高效且灵活...同时,理解并掌握STL的设计原则,如迭代器和泛型编程,将有助于你成为更优秀的C++开发者。
C++泛型编程,联系代码手稿。容器、模版、STL:string、vector、deque、stack、queue、list、map、set,函数对象:仿函数、谓词、常见库算法:遍历、查找、排序
本书《C++STL中文版》是专门针对C++STL的详细介绍和讨论。书中作者P.J.Plauger、Alexander A. Stepanov、Meng Lee和David R. Musser,都是在C++STL实现方面有着卓越贡献的专家。这本教科书详细地解说了STL的各个方面...
同时,也能让我们更好地掌握C++模板机制,以及如何利用泛型编程来编写高效且可复用的代码。通过分析源码,我们可以学习到如何平衡空间和时间复杂度,以及如何设计和实现高效的数据结构和算法。这对于任何想要深入...
通过模板,STL能处理不同类型的元素,实现泛型编程。例如,`std::vector<int>`和`std::vector<std::string>`都是合法的类型,这得益于模板的灵活性。 此外,STL与C++标准库的其他部分(如智能指针、异常处理、输入/...
C++模板编程是C++语言中的一个重要特性,它允许开发者创建泛型代码,即能够处理多种数据类型的代码。模板分为函数模板和类模板,它们都提供了代码重用和类型无关性的能力。 函数模板允许我们定义一个可以接受不同...
STL的主要目标是提高代码的重用性,简化编程工作,并通过泛型编程(Generic Programming)提升程序的性能。在这本《C++ STL程序员开发指南》中,你将深入学习如何有效地使用STL进行C++程序设计。 一、STL的核心组件...
第4章 C++ STL泛型库概述 48 4.1 C++ STL的发展历程 48 4.2 C++ STL的各种实现版本 49 4.2.1 HP STL 49 4.2.2 SGI STL 50 4.2.3 STLport 50 4.2.4 P.J.Plauger STL 50 4.2.5 Rouge Wave STL 50 4.3...
C++模板和STL库是C++编程语言中的两个核心特性,它们极大地提高了代码的复用性和效率。本文将深入探讨这两个主题,并提供丰富的实践应用示例。 首先,我们来理解C++模板。模板是C++的一个强大工具,它允许程序员...
同时,STL的设计遵循了面向对象和泛型编程的原则,使得代码更具有可读性和可复用性。 手册中的彩色界面和按首字母排序的功能,使得在开发过程中快速定位所需函数变得轻松快捷。目录和索引链接使用户能够通过不同...
第4章 C++ STL泛型库概述 48 4.1 C++ STL的发展历程 48 4.2 C++ STL的各种实现版本 49 4.2.1 HP STL 49 4.2.2 SGI STL 50 4.2.3 STLport 50 4.2.4 P.J.Plauger STL 50 4.2.5 Rouge Wave STL 50 4.3...
STL提供了泛型编程的工具,如迭代器、容器、算法和函数对象,这些都以模板的形式存在,允许开发者创建高度可重用的代码。 5. **WinAPI库**:Visual C++也提供了对Windows API的直接访问,这使得开发者可以直接控制...
C++泛型编程,也称为模板(Template),是C++语言中的一个重要特性,它允许开发者创建可重用的代码片段,这些片段可以适用于多种数据类型。泛型编程的主要目标是提高代码的灵活性和效率,避免因类型不同而重复编写...
STL的设计理念是通过泛型编程,使代码具有更强的抽象性和通用性。与面向对象编程(OOP)相比,泛型编程更注重数据和操作的分离,使得代码更加灵活,可以适应多种数据类型。在Java等不支持泛型编程的语言中,实现类似...
在C++编程中,STL(Standard Template Library,标准模板库)是一组高效、泛型的容器、算法和迭代器的集合,极大地提高了程序的可重用性和开发效率。本篇将详细介绍C++ STL中的一些关键容器,如priority_queue、...
第4章 C++ STL泛型库概述 48 4.1 C++ STL的发展历程 48 4.2 C++ STL的各种实现版本 49 4.2.1 HP STL 49 4.2.2 SGI STL 50 4.2.3 STLport 50 4.2.4 P.J.Plauger STL 50 4.2.5 Rouge Wave STL 50 4.3...