上几篇中已经实现了一个简单版的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. Flutter 踩坑之build函数返回了null

    今天遇到一个bug,内容都正常显示没问题,但是控制台里报错,如图: 翻译了下,说是函数不能返回空值,搜索了下,网上相同问题的是少写了个return,我检查了下也没发现少return的,后来突然发现if ...

  2. 网络编程(socket).WinSocket_recvfrom出错,GetLastError()为10054

    1.在写 我的Qt598(vs2017)x64版本的 shadowsocks程序时遇到的. 具体问题情况 大概是这样:QUdpSocket(假设是sktA) connect接收函数,sktA侦听 端口 ...

  3. Ant 构建 Jmeter脚本报错详解

    在搭建Ant构建Jmeter脚本的时候,小组成员遇到了各种问题. 再这里总结一下,遇到类似问题的可以做个参考 1.提示 does not exist 解决方案: 出现这种的问题原因有很多. 先排除权限 ...

  4. golang 切片扩容, 时间复杂度

    在切片扩容时,如果原来的底层数组足够大,能放的下 append 的数据,就不会新建底层数组.而如果不够的话,则会分配一个新的数组.也因此是 O(n) 的时间复杂度

  5. NPM的安装和使用权限问题

    npm之前在默认情况下装过@angular/cli, 安装和使用都没有任何问题, 但是有的包全局安装的时候会提示权限不足, 于是网上搜索了修复此问题的方法, 就是将npm的全局安装目录搬到有权限的文件 ...

  6. BBC这10部国宝级纪录片,让孩子看遍世间最美的地方

    https://weibo.com/ttarticle/p/show?id=2309404382383649486138#related

  7. Redis 常用命令学四:列表类型命令

    1.在列表两端增加值的命令 127.0.0.1:6379> lpush 1 (error) ERR wrong number of arguments for 'lpush' command 1 ...

  8. Vue路由系统

    Vue路由系统 一切分离都是为了更好的结合,本文详细介绍了前后端分离架构之后,前端如何实现路由控制,即Vue路由系统. 一.VueRouter实现原理 VueRouter的实现原理是根据监控锚点值的改 ...

  9. JVM命令行参数解析

    1. java命令行参数 先看java命令行的参数 solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$ java Usage: java [- ...

  10. (五)CXF之添加拦截器

    一.需求分析 webService中的拦截器类似于servlet的Filter过滤器.一般用于调用服务前后先调用拦截器的方法. 二.案例 本章案例是基于上一章节的基础上添加拦截器的 2.1 服务端添加 ...