上几篇中已经实现了一个简单版的String字符串类,但是实际开发中不用我们自己实现了,学习Java的也知道有一个系统现成的用,当然强大的C++也不例外,下面就来学习一下系统定义的string是怎么用的。

  • string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。
  • 它有两种形式:
      typedef basic_string<char> string;
      typedef basic_string<wchar_t> wstring; 它是支持宽字符的~
  • 要使用string类型对象,必须包含相关头文件 
    #include <string>

    using std::string;

实际上string属于STL标准模板库中的范畴,虽然还没学到模板,这个会在之后系统的学习,但是不影响学习,像上面出现的basic_string<char>和basic_string<wchar_t>就是一个模板类,只要知道string是一个模板类既可,其实用的时候可以将它当正常的类使用,下面来使用一下:


以下几种全为它的构造形式,只是一小部份,它还有很多构造形式,具体可以查看帮助文档:

  • string s1;   //默认构造函数,s1为空串
  • string s2(s1);   //将s2初始化为s1的一个副本
  • string s3(“value”);   //将s3初始化为一个字符串字面值副本
  • string s4(n, ‘c’);  //将s4初始化为字符‘c’的n个副本

编译运行:

对于string到底有哪一些函数,需要学会使用帮助,就像学java时也需要看JDK帮助文档一样:在studio中按F11既可查看【如果没有安装本地的帮助,可以上官网查询:https://msdn.microsoft.com/en-us/library/3bstk3k5.aspx】:

其中string就是basic_string,可以查看一下它:

所以其实代码可以这样写:

编译运行:

下面则来查看一下basic_string类的帮助:

查击可以看到它有N多种构造形式:

basic_string(
const value_type* _Ptr,
size_type _Count,
const allocator_type& _Al = Allocator ( )
);
basic_string(
const value_type* _Ptr,
const allocator_type& _Al = Allocator ( )
);
basic_string(
const basic_string& _Right,
size_type _Roff,
size_type _Count = npos,
const allocator_type& _Al = Allocator ( )
);
basic_string(
size_type _Count,
value_type _Ch,
const allocator_type& _Al = Allocator ( )
);
explicit basic_string(
const allocator_type& _Al = Allocator ( )
);
template<class _It>
basic_string(
_It _First,
_It _Last,
const allocator_type& _Al = Allocator ( )
);
basic_string(
const_pointer _First,
const_pointer _Last
);
basic_string(
const_iterator _First,
const_iterator _Last
);

那对于目前我们使用的带一个参数的是哪种形式呢?

代码如下:

编译运行:

明白了查看帮助文档,那学习其它形式的构造函数就比较容易了,下面再来使用一下其它构造:

编译运行:

下面继续再来介绍一个带迭待器的构造,如下:

编译运行:

那结果是多少呢?

是不是跟预想的不一样,因为它是一个闭开区间(包含first位置上的字符,不包含last位置上的字符),而为什么s2.end()可以包含最后一个字符呢?因为它的位置是在最后一个字符后面,这个需要注意。

下面用代码来使用一下喽,对于有编程经验的人来说其实挺简单的:

结果:

其函数的使用参数可以参考文档:

还有这种形式的:

下面也来试一下:

正如之前实现的自己的String类一样,相加运算一定是前面两个有一个为对象才行,上面修改如下:

另外字符串中有一个很重要并且实际中会经常要用到的一个成员,如下:

不行,那么接下来这个成员函数就派上用场了:

关于这个错误应该比较有经验了,去掉常量性既可:

最后再介绍四个函数:

下面直接看程序:

#include <string>
#include <iostream>
using namespace std;
int main()
{
string strinfo=" //*---Hello World!......------";
string strset= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
string::size_type first = strinfo.find_first_of(strset);//在strinfo中查找第一个在strset时面的字符位置,也就是'H',在strinfo中是第7位
if(first == string::npos)
cout<<"not find any characters"<<endl;
string::size_type last = strinfo.find_last_of(strset);//在strinfo中查找最后一个在strset时面的字符位置,也就是'd',在strinfo中是第17位
if(last == string::npos)
cout<<"not find any characters"<<endl;
cout << strinfo.substr(first, last - first + )<<endl;//闭开区间来截取字符
return ;
}

结果是:

#include <string>
#include <iostream>
using namespace std;
int main()
{
string strinfo=" //*---Hello World!......------";
string strset= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
string::size_type first = strinfo.find_first_not_of(strset);//在strinfo中查找第一个不在strset时面的字符位置,也就是' ',在strinfo中是第0位
if(first == string::npos)
cout<<"not find any characters"<<endl;
string::size_type last = strinfo.find_last_of(strset);//在strinfo中查找最后一个在strset时面的字符位置,也就是'd',在strinfo中是第17位
if(last == string::npos)
cout<<"not find any characters"<<endl;
cout << strinfo.substr(first, last - first + )<<endl;//闭开区间来截取字符
return ;
}

#include <string>
#include <iostream>
using namespace std;
int main()
{
string strinfo=" //*---Hello World!......------";
string strset= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
string::size_type first = strinfo.find_first_not_of(strset);//在strinfo中查找第一个不在strset时面的字符位置,也就是' ',在strinfo中是第0位
if(first == string::npos)
cout<<"not find any characters"<<endl;
string::size_type last = strinfo.find_last_not_of(strset);//在strinfo中查找最后一个不在strset时面的字符位置,也就是'-',在strinfo中是最后一位
if(last == string::npos)
cout<<"not find any characters"<<endl;
cout << strinfo.substr(first, last - first + )<<endl;//闭开区间来截取字符
return ;
}

这四个函数有什么作用呢?可以用这四个函数来实现这个功能:实现一个字符串去除左右空格~

关于这个功能的编写在下编中再见~

标准库类型之string的更多相关文章

  1. C++ 标准库类型-String,Vector and Bitset

    <C++ Primer 4th>读书摘要 最重要的标准库类型是 string 和 vector,它们分别定义了大小可变的字符串和集合.这些标准库类型是语言组成部分中更基本的那些数据类型(如 ...

  2. 谈谈两种标准库类型---string和vector

    两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列. 一.标准库 ...

  3. C++ Primer 第三章 标准库类型string运算

    1. 标准库类型 string string表示可变长的字符序列,使用string必须首先包含string头文件.如何初始化类的对象是由类本身决定的. int n; string s1;//默认初始化 ...

  4. C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型

     标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更主要的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:由 ...

  5. C++ Primer 第三章 标准库类型vector+迭代器iterator 运算

    1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...

  6. 标准库类型vector

    标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它被称为容器. 要想使用vector, ...

  7. C++ Primer笔记1_转义字符_标准库类型string_标准库类型vector

    1.转义字符 一般有两种方式: \x后紧跟1个或多个十六进制数字.或\后紧跟1.2.3个八进制数字,当中数字部分是字符相应的数值. #include <iostream> using na ...

  8. C++标准库类型vector及迭代器iterator简介

    Vector是C++标准库类型,称为容器,一个容器中的所有对象必须是同一种类型的.与数组相比,其最大的优点就是动态增长.Vector是一个类模板,并不是数据类型,而vector<int>和 ...

  9. C++primer第三章标准库类型

    除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...

随机推荐

  1. 图说socket与系统调用代码架构

    1.引言 正式开始之前,每个人心里都应该有一点逼数,就像下面这张图一样. 系统调用也是函数调用,系统函数也是函数代码.系统函数与普通函数唯一的不同在于,系统函数可以使用cpu体系结构指令集中的特权指令 ...

  2. Linux系统目录的学习

    1.在公司中linux 都是没有界面 2.系统路径    2.1 /表示根目录    2.2 ~表示/root    2.3etc:存放系统配置文件    2.4 home  除了root 以外所有用 ...

  3. Centos安装 k8s

    ### 一. 安装docker 1.安装依赖包```shellsudo yum install -y yum-utils device-mapper-persistent-data lvm2 ``` ...

  4. 20191011-构建我们公司自己的自动化接口测试框架-Util的TestDataHandler模块

    TestDataHandler模块主要是做测试数据的处理,包括转换数据格式和变量参数处理转换数据格式函数: data是数据,data以$()的方式识别变量,如果请求的数据有变量,则将变量用global ...

  5. S03_CH08_DMA_LWIP以太网传输

    S03_CH08_DMA_LWIP以太网传输 8.1概述 本例程详细创建过程和本季课程第一课<S03_CH01_AXI_DMA_LOOP 环路测试>非常类似,因此如果读者不清楚如何创建工程 ...

  6. asp.net core-13.Cookie-based认证实现

    1.打开visual studio code创建一个MVC项目

  7. poj 3617 弱鸡贪心

    比赛的时候扣了一道贪心的题目,不会写,,现在补一补一些基础的贪心. 题意:给定一个字符串s,要求按下列操作生成一个新串t--每次从s串中的最前和最后取一个字符给t,要求生成的t字典序最小. 题解:由于 ...

  8. hdu 4857 反向拓扑问题

    尤其要注意拓扑的分层问题 不难理解 就是不怎么好想到 拓扑的思路这里就不累述了 #include <iostream> #include <cstdio> #include & ...

  9. (二十九)JSP之国际化

    导入 <%@ taglib url="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 创建三个语 ...

  10. Html Agility Pack 使用 XPath 选择器

    想做一个爬虫程序,以前用的一直使用CSS选择器的html解析插件,最近做的项目想使用 Html Agility Pack 来做解析 Html Agility Pack使用 XPath 和 Linq 来 ...