string类------新标准c++程序设计
来源:互联网 发布:java socket编程 代码 编辑:程序博客网 时间:2024/06/08 11:10
定义:
string类是STL中basic_string模板实例化得到的模板类。其定义如下:
typedef
basic_string<
char
>string;
构造函数:
string类有多个构造函数,但没有接收一个整型参数或一个字符型参数的构造函数
string s1();
//s1=""
string s2(
"hello"
);
//s2="hello"
string s3(4,
'k'
);
//s3="kkkk"
string s4(
"12345"
,1,3);
//s4="234" 即“12345”的从下标1开始,长度为3的子串<br><br>string s5('k'); //非法错的<br>string s6(123); //非法错的
赋值函数:
可以用char*类型的变量、常量,以及char类型的变量、常量对string对象进行赋值。例如:
string s1;
s1=
"hello"
;
//s1="hello"
s2=
'k'
;
//s2="k"<br><br>char a[5]="1234";<br>s3=a; //s3="1234"
string类还有assign成员函数,可以用来对string对象赋值。assign成员函数返回对象自身的引用。例如:
string s1(
"12345"
),s2;
s3.assign(s1);
//s3=s1
s2.assign(s1,1,2);
//s2="23",即s1的子串(1,2)
s2.assign(4,
'k'
);
//s2="kkkk"
s2.assign(
"abcde"
,2,3);
//s2="cde",即“abcde”的子串(2,3)
s2.assign(
"12345"
).assign(
"678"
);
//返回对自身的引用,可以继续在后面调用assign成员函数 s2="678"
求字符串长度:
length成员函数返回字符串的长度。size成员函数可以实现同样的功能。
返回char类型字符串:
string x=“123”;
x.c_str();
// “123”
string对象中字符串的连接:
可以使用“+”和“+=”运算符对string对象执行字符串的连接操作,string类还有append成员函数,也可以用来向字符串后面添加内容。append成员函数返回对象自身的引用。例如:
string s1(
"123"
),s2(
"abc"
);
s1.append(s2);
//s1="123abc"
s1.append(s2,1,2);
//s1="123abcbc"
s1.append(3,
'k'
);
//s1="123abcbckkk"
s1.append(
"ABCDE"
,2,3);
//s1="123abcbckkkCDE",添加“ABCDE“子串(2,3)
string对象的比较:
可以用“<”、"<="、"=="、、“!=”、">="、">"运算符比较string对象。string类还有compare成员函数,可以用来比较字符串.compare成员函数有以下返回值:小于0表示当前的字符串小;等于0表示两个字符串相等;大于0表示另一个字符串小。例如:
string s1(
"hello"
),s2(
"hello,world"
);
int
n=s1.compare(s2);
n=s1.compare(1,2,s2,0,3);
//比较s1的子串(1,2)和s2的子串(0,3)
n=s1.compare(0,2,s2);
//比较s1的子串(0,2)和s2
n=s1.compare(
"Hello"
);
n=s1.compare(1,2,
"Hello"
);
//比较s1的子串(1,2)和"Hello"
n=s1.compare(1,2,
"Hello"
,1,2);
//比较s1的子串(1,2)和“Hello”的子串(1,2)
求string对象的子串:
substr成员函数可以用来求子串(n,m)原型如下:
string substr(
int
n=0,
int
m=string::npos)
const
调用时,如果省略m或m超过了字符串的长度,则求出来的子串就是从下标n开始一直到字符串结束的部分。例如:
string s1=
"this is ok"
;
string s2=s1.substr(2,4);
//s2="is i"
s2=s1.substr(2);
//s2="is is ok"
交换两个string对象的内容:
swap成员函数可以交换两个dtring对象的内容。例如:
string s1(
"west"
),s2(
"east"
);
s1.swap(s2);
//s1="east" s2="west"
查找子串和字符:
string类有6种查找子串和字符的成员函数,每种函数以不同形式的 find 命名。它们的返回值都是子串或字符在string对象字符串中的位置(即下标 string::size_type 类型的值)。如果查不到,则返回string::npos。string::npos是在string类中定义的一个静态常量。string::nops 原意 no position(无位置),是 unsigned int的最大值 UINT_MAX=4294967295 ,即查找到最后位置也没有匹配。在int 下数值刚好为-1, 也可以理解为 返回不存在的下标。
这些函数如下:
find:从前往后查找子串或字符出现的位置。
rfind:从后往前查找子串或字符出现的位置。
find_first_of:从前往后查找何处出现另一个字符串中包含的字符。例如:
s1.find_first_of(
"abc"
);
//查找s1zhong第一次出现“abc”中任一字符的位置
find_last_of:从后往前查找何处出现另一个字符串中包含的字符。
find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。
find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。
下面是string类的查找成员函数的示例程序:
#include<iostream>
#include<string>
using
namespace
std;
int
main(){
string s1(
"Source Code"
);
int
n;
if
((n=s1.find(
'u'
))!=string::npos)
//查找u出现的位置
cout<<
"1)"
<<n<<
","
<<s1.substr(n)<<endl;
//输出 1)2,urce Code
if
(n=s1.find(
"Source"
,3)==string::npos)
//从下表3开始查找"Source",找不到
cout<<
"2)"
<<
"Not Found"
<<endl;
//输出 2)Not Found
if
((n=s1.find(
"Co"
))!=string::npos)
//查找子串"Co"。能找到,返回"Co"的位置
cout<<
"3)"
<<n<<
","
<<s1.substr(n)<<endl;
//输出 3)7,Code
if
((n=s1.find_first_of(
"ceo"
))!=string::npos)
//查找第一次出现"c"、'e'或'0'的位置
cout<<
"4)"
<<n<<
","
<<s1.substr(n)<<endl;
//输出 4)1,ource Code
if
((n=s1.find_last_of(
'e'
))!=string::npos)
//查找最后一个'e'的位置
cout<<
"5)"
<<n<<
","
<<s1.substr(n)<<endl;
//输出 5)10,e
if
((n=s1.find_first_not_of(
"eou"
,1))!=string::npos)
//从下标1开始查找第一次出现非'e','o'或‘u’字符的位置
cout<<
"6)"
<<n<<
","
<<s1.substr(n)<<endl;
//输出 6)3,rec Code
return
0;
}
替换子串:
replace成员函数可以对string对象中的子串进行替换,返回值为对象自身的引用。例如:
string s1(
"Real Steel"
);
s1.replace(1,3,
"123456"
,2,4);
//用“123456”的子串(2,4)替换s1的子串(1,3)
cout<<s1<<endl;
//输出 R3456 Steel
string s2(
"Harry Potter"
);
s2.replace(2,3,5,
'0'
);
//用5个'0'替换子串(2,3)
cout<<s2<<endl;
//输出 Ha00000 Potter
int
n=s2.find(
"00000"
);
//查找子串“00000”的位置,n=2
s2.replace(n,5,
"XXX"
);
//将子串(n,5)替换为“XXX”
cout<<s2<<endl;
//输出 HaXXX Potter
删除子串:
erase成员函数可以删除string对象中的子串,返回值为对象自身的引用。例如:
string s1(
"Real Steel"
);
s1.erase(1,3);
//删除子串(1,3),此后s1=“R Steel”
s1.erase(5);
//删除下标5及其后面的所有字符。此后s1=“R Ste”
插入字符串:
insert成员函数可以在string对象中插入另一个字符串,返回值为对象自身的引用。例如:
string s1(
"Limitless"
),s2(
"00"
);
s1.insert(2,
"123"
);
//在下标2处插入字符串“123”,s1="Lil123mitless“
s1.insert(3,s2);
//在下标2处插入s2,s1="Lil0023mitless"
s1.insert(3,5,
'x'
);
//在下标3处插入5个'x',s1=”Li1xxxxx0023mitless”
将string对象作为流处理:
使用流对象istringstream和ostringstream,可以将string对象当作一个流进行输入输出。这两个类需要包含头文件sstream。示例程序如下:
#include <iostream>
#include <sstream>
#include <string>
using
namespace
std;
int
main(){
string src(
"Avatar 123 5.2 Titanic K"
);
istringstream istrStream(src);
//建立src到istrStream的联系
string s1, s2;
int
n;
double
d;
char
c;
istrStream >> s1 >> n >> d >> s2 >> c;
//把src的内容当做输入流进行读取
ostringstream ostrStream;
ostrStream << s1 << endl << s2 << endl << n << endl << d << endl << c <<endl;
cout << ostrStream.str();
return
0;
}
该程序的输出结果是:
Avatar
Titanic
123
5.2
K
第十一行,从输入流istrStream进行读取,过程和从cin读取一样。
第十二行,将变量的值输出到流ostrStream。输出结果并不会出现在屏幕上,而是被保存在ostrStream对象管理的某处。用ostringstream类的str成员函数能将输出到ostringstream对象中的内容提取出来。
用STL算法操作string对象:
string对象也可以看作一个顺序容器,它支持随机访问迭代器,也有begin和end等成员函数。STL中的许多算法也适用于string对象。下面是STl算法操作string对象的程序示例:
#include<iostream>
#include<algorithm>
#include<string>
using
namespace
std;
int
main(){
string s(
"afgcbed"
);
string::iterator p=find(s.begin(),s.end(),
'c'
);
if
(p!=s.end())
cout<<p-s.begin()<<endl;
//输出3
sort(s.begin(),s.end());
cout<<s<<endl;
//输出abcdefg
next_permutation(s.begin(),s.end());
cout<<s<<endl;
//输出abcdegf
return
0;
}
注意:
1、string与字符数组不同的是,一个string对象的大小是固定的,即表达式sizeof(string)的值是固定的,和其中存放的字符串的长度无关。但这个固定的值在不同编译器中不相同。例如,在Dev C++中是4,在vs2010中是32,string对象中并不直接存放字符串,字符串会在别处开辟内存空间存放,string对象值存放该空间的地址,或者再加上其他一些信息。
2、用普通字符对string对象赋值,普通字符串的内容会被复制到string对象所管理的那片内存空间中。
3、string对象在比较大小时是按词典序比较的,而且是大小写相关的。由于大写字母的ASCII码小于小写字母的ASCII码(‘A’~‘Z’的ASCII码是0x41~0x5a,‘a’~‘z’的ASCII码是0x61~0x7a),所以Zbc比abc小。
新标准c++程序设计
转载请注明出处
- string类------新标准c++程序设计
- c 语言新标准
- C语言新标准C11
- C语言新标准C11
- [c++]c++11 新标准
- 新标准c++程序设计教程chapter1_2015.7.19
- 新标准c++程序设计教程chapter2_2015.7.20
- 新标准c++程序设计教程chapter2_2015.7.21
- 新标准c++程序设计教程chapter2_2015.7.22
- 新标准c++程序设计教程chapter2_2015.7.28
- ISO C语言新标准(C11)
- 新标准
- C 语言新标准——C11
- C11标准委员会成员解读C语言新标准
- C11标准委员会成员解读C语言新标准
- ISO发布新的C语言——新标准C11
- 指针和动态分配内存 (不定长度数组)------新标准c++程序设计
- 【C/C++】String类实现
- 文本分类需要CNN?No!fastText完美解决你的需求(后篇)
- Django 博客
- RelativeLayout的几个关键属性
- 图片上传以及允许连续上传同一图片
- [MySQL]事务和ACID原则
- string类------新标准c++程序设计
- 函数
- TensorFlow系列教程(4)---手写字体识别
- 嵌入式& 操作系统概述
- 进程管理
- 深入理解java虚拟机(垃圾回收)
- Android开发 之 动态显示和隐藏状态栏和导航栏
- java在标签对内赋值
- 国家图书馆提示“对不起,系统检测您还没有安装PDF阅读器”的解决方法 | 国家电子图书馆