string类------新标准c++程序设计

时间:2022-12-08 09:29:51

定义:

  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的子串 string s5('k'); //非法错的
string s6(123); //非法错的

赋值函数:

  可以用char*类型的变量、常量,以及char类型的变量、常量对string对象进行赋值。例如:

string s1;
s1="hello"; //s1="hello"
s2='k'; //s2="k" char a[5]="1234";
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小。

转载请注明出处:http://www.cnblogs.com/goudanli/p/7664213.html

新标准c++程序设计

string类------新标准c++程序设计的更多相关文章

  1. 封闭类------新标准c&plus;&plus;程序设计

      封闭类:  一个类的成员变量如果是另一个类的对象,就称之为“成员对象”.包含成员对象的类叫封闭类. #include<iostream> using namespace std; cl ...

  2. 正确处理类的复合关系------新标准c&plus;&plus;程序设计

    假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类.狗是有主人的,主人也有狗.假定狗只有一个主人,但一个主人可以有最多10条狗.该如何处理“主人”类和“狗”类的关系呢?下面是 ...

  3. 类与类之间的两种关系------新标准c&plus;&plus;程序设计

    在c++中,类和类之间有两种基本关系:复合关系和继承关系. 复合关系也称为“has a”关系或“有”的关系,表现为封闭类,即一个类以另一个类的对象作为成员变量. 继承关系也称为“is a”关系或“是” ...

  4. 类的互相包含------新标准c&plus;&plus;程序设计

    #include<iostream> using namespace std; class A; class B{ public: void f(A* pt){}; } class A{ ...

  5. 在成员函数中调用虚函数(关于多态的注意事项)------新标准c&plus;&plus;程序设计

    类的成员函数之间可以互相调用.在成员函数(静态成员函数.构造函数和析构函数除外)中调用其他虚成员函数的语句是多态的.例如: #include<iostream> using namespa ...

  6. 多态实现的原理------新标准c&plus;&plus;程序设计

    “多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定.例子: #include<iostream> using namespac ...

  7. 多态的作用-游戏编程展示------新标准c&plus;&plus;程序设计

    游戏软件的开发最能体现面向对象设计方法的优势.游戏中的人物.道具.建筑物.场景等都是很直观的对象,游戏运行的过程就是这些对象相互作用的过程.每个对象都有自己的属性和方法,不同对象也可能有共同的属性和方 ...

  8. 复制构造函数被调用的三种情况------新标准c&plus;&plus;程序设计

    1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...

  9. this指针------新标准c&plus;&plus;程序设计

    背景:   c++是在c语言的基础上发展而来的,第一个c++的编译器实际上是将c++程序翻译成c语言程序,然后再用c语言编译器进行编译.c语言没有类的概念,只有结构,函数都是全局函数,没有成员函数.翻 ...

随机推荐

  1. &lbrack;YII&rsqb;将ar查询结果转化成数组

    $Column= Column::model()->findAll(); $data = array_map(create_function('$m', 'return $m->getAt ...

  2. h&period;264加权预测

    帧间运动是基于视频亮度(luma)不发生改变的一个假设,而在视频序列中经常能遇到亮度变化的场景,比如淡入淡出.镜头光圈调整.整体或局部光源改变等,在这些场景中,简单帧间运动补偿的效果可想而知(实际编码 ...

  3. h5适配的解决方案

    一. 流程 设计师以750pt×1334pt尺寸进行设计(当然高度随内容变化),最后用该尺寸的设计稿进行标注.切图,前端采用淘宝的开源方案flexible进行适配. 二. flexible使用方法 F ...

  4. Vuex初级入门及简单案例

    1.为什么要使用Vuex? (1)方便所有组件共享信息,方便不同组件共享信息. (2)某个组件需要修改状态和需求.   2.状态有哪些? (1)组件内部定义的data状态(通过组件内部修改) (2)组 ...

  5. environment variable

    %ALLUSERSPROFILE% C:\ProgramData %APPDATA% C:\Users\cuthead\AppData\Roaming %COMMONPROGRAMFILES% C:\ ...

  6. 基于c&num;的windows基础设计(学习日记2)【关于多态】

    这次的多态很简单,没什么知识点 . 直接贴代码了: public abstract class Animal //建立一个抽象类 { private bool m_sex; private strin ...

  7. Memcached、Redis、RabbitMQ

    目录 一.Memcached 二.Redis 三.RabbitMQ Memcached Memcache 是一个开源.高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中 ...

  8. 判断颜色信息-RGB2HSV

    前言 项目车号识别过程中,车体有三种颜色黑车黑底白字.红车红底白字.绿车黄底绿字,可以通过判断车体的颜色信息,从而判断二值化是否需要反转,主要是基于rgb2hsv函数进行不同颜色的阈值判断. MATL ...

  9. dataTable配置项说明

    Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 官网地址:https://datatables.net/ 中文说明地址:http:/ ...

  10. dpkg 打包root权限app

    dpkg 安装Macports 下载对应系统的Macports安装时间会比较久,安装完毕后放在了/opt/local/bin 目录下 安装dpkg 打开终端,输入 sudo port -f insta ...