标准库类型之string
上几篇中已经实现了一个简单版的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的更多相关文章
- C++ 标准库类型-String,Vector and Bitset
<C++ Primer 4th>读书摘要 最重要的标准库类型是 string 和 vector,它们分别定义了大小可变的字符串和集合.这些标准库类型是语言组成部分中更基本的那些数据类型(如 ...
- 谈谈两种标准库类型---string和vector
两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列. 一.标准库 ...
- C++ Primer 第三章 标准库类型string运算
1. 标准库类型 string string表示可变长的字符序列,使用string必须首先包含string头文件.如何初始化类的对象是由类本身决定的. int n; string s1;//默认初始化 ...
- C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型
标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更主要的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:由 ...
- C++ Primer 第三章 标准库类型vector+迭代器iterator 运算
1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...
- 标准库类型vector
标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它被称为容器. 要想使用vector, ...
- C++ Primer笔记1_转义字符_标准库类型string_标准库类型vector
1.转义字符 一般有两种方式: \x后紧跟1个或多个十六进制数字.或\后紧跟1.2.3个八进制数字,当中数字部分是字符相应的数值. #include <iostream> using na ...
- C++标准库类型vector及迭代器iterator简介
Vector是C++标准库类型,称为容器,一个容器中的所有对象必须是同一种类型的.与数组相比,其最大的优点就是动态增长.Vector是一个类模板,并不是数据类型,而vector<int>和 ...
- C++primer第三章标准库类型
除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...
随机推荐
- Flutter 踩坑之build函数返回了null
今天遇到一个bug,内容都正常显示没问题,但是控制台里报错,如图: 翻译了下,说是函数不能返回空值,搜索了下,网上相同问题的是少写了个return,我检查了下也没发现少return的,后来突然发现if ...
- 网络编程(socket).WinSocket_recvfrom出错,GetLastError()为10054
1.在写 我的Qt598(vs2017)x64版本的 shadowsocks程序时遇到的. 具体问题情况 大概是这样:QUdpSocket(假设是sktA) connect接收函数,sktA侦听 端口 ...
- Ant 构建 Jmeter脚本报错详解
在搭建Ant构建Jmeter脚本的时候,小组成员遇到了各种问题. 再这里总结一下,遇到类似问题的可以做个参考 1.提示 does not exist 解决方案: 出现这种的问题原因有很多. 先排除权限 ...
- golang 切片扩容, 时间复杂度
在切片扩容时,如果原来的底层数组足够大,能放的下 append 的数据,就不会新建底层数组.而如果不够的话,则会分配一个新的数组.也因此是 O(n) 的时间复杂度
- NPM的安装和使用权限问题
npm之前在默认情况下装过@angular/cli, 安装和使用都没有任何问题, 但是有的包全局安装的时候会提示权限不足, 于是网上搜索了修复此问题的方法, 就是将npm的全局安装目录搬到有权限的文件 ...
- BBC这10部国宝级纪录片,让孩子看遍世间最美的地方
https://weibo.com/ttarticle/p/show?id=2309404382383649486138#related
- Redis 常用命令学四:列表类型命令
1.在列表两端增加值的命令 127.0.0.1:6379> lpush 1 (error) ERR wrong number of arguments for 'lpush' command 1 ...
- Vue路由系统
Vue路由系统 一切分离都是为了更好的结合,本文详细介绍了前后端分离架构之后,前端如何实现路由控制,即Vue路由系统. 一.VueRouter实现原理 VueRouter的实现原理是根据监控锚点值的改 ...
- JVM命令行参数解析
1. java命令行参数 先看java命令行的参数 solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$ java Usage: java [- ...
- (五)CXF之添加拦截器
一.需求分析 webService中的拦截器类似于servlet的Filter过滤器.一般用于调用服务前后先调用拦截器的方法. 二.案例 本章案例是基于上一章节的基础上添加拦截器的 2.1 服务端添加 ...