c++11 标准模板(STL)(std::basic_stringbuf)(三)

news2024/11/23 12:37:55
定义于头文件 <sstream>
template<

    class CharT,
    class Traits = std::char_traits<CharT>,
    class Allocator = std::allocator<CharT>

> class basic_stringbuf : public std::basic_streambuf<CharT, Traits>

 std::basic_stringbuf 是关联字符序列为内存常驻的任意字符序列的 std::basic_streambuf 。能从 std::basic_string 的实例初始化它,或将它做成该类的实例。

std::basic_stringbuf 的典型实现保有一个 std::basic_string 类型对象,或等价的可伸缩序列容器作为数据成员,并将它同时用作受控制字符序列(为 std::basic_streambuf 的六个指针所指向的数组)和关联字符序列(所有输入操作的字符源和输出操作的目标)。

另外,典型的实现保有一个 std::ios_base::openmode 类型的数据成员,以指示流的状态(只读、只写、读写、尾端写等)。

若 overflow() 使用过分配策略,则可存储另外的高水位指针,以跟踪最后初始化的字符。(C++11 起)

亦提供二个对常用字符类型的特化:

类型定义
stringbufbasic_stringbuf<char>
wstringbufbasic_stringbuf<wchar_t>

公开成员函数

赋值 basic_stringbuf 对象

std::basic_stringbuf<CharT,Traits,Allocator>::operator=

std::basic_stringbuf& operator=( std::basic_stringbuf&& rhs );

(1)(C++11 起)

std::basic_stringbuf& operator=( const std::basic_stringbuf& rhs ) = delete;

(2)

1) 移动赋值运算符:移动 rhs 的内容到 *this 中。移动后 *this 拥有 rhs 之前保有的关联 string 、打开模式、本地环境和所有其他状态。保证 *this 中 std::basic_streambuf 的六个指针有别于被移动的 rhs 的对应指针,除非它们为空。

2) 复制赋值运算符被删除; basic_stringbuf可复制赋值 (CopyAssignable) 。

参数

rhs-将被移动的另一 basic_stringbuf

返回值

*this

 调用示例

#include <sstream>
#include <string>
#include <iostream>

int main()
{
    std::basic_stringbuf<char> one("one", std::ios_base::in
                                   | std::ios_base::out
                                   | std::ios_base::ate);

    std::basic_stringbuf<char> two("two", std::ios_base::in
                                   | std::ios_base::out
                                   | std::ios_base::ate);

    std::cout << "Before move, one = \"" << one.str() << '"'
              << " two = \"" << two.str() << "\"" << std::endl;

    //1) 移动赋值运算符:移动 rhs 的内容到 *this 中。
    //移动后 *this 拥有 rhs 之前保有的关联 string 、打开模式、本地环境和所有其他状态。
    //保证 *this 中 std::basic_streambuf 的六个指针有别于被移动的 rhs 的对应指针,除非它们为空。
    one = std::move(two);

    std::cout << "After move, one = \"" << one.str() << '"'
              << " two = \"" << two.str() << "\"" << std::endl;

    return 0;
}

输出

交换二个 basic_stringbuf 对象

std::basic_stringbuf<CharT,Traits,Allocator>::swap

void swap( std::basic_stringbuf& rhs )

(C++11 起)

交换 *this 和 rhs 的状态与内容。

参数

rhs-另一 basic_stringbuf

返回值

(无)

注意

交换 std::stringstream 对象时自动调用此函数,很少需要直接调用它。

调用示例

#include <sstream>
#include <string>
#include <iostream>

int main()
{
    std::basic_stringbuf<char> one("one", std::ios_base::in
                                   | std::ios_base::out
                                   | std::ios_base::ate);

    std::basic_stringbuf<char> two("two", std::ios_base::in
                                   | std::ios_base::out
                                   | std::ios_base::ate);

    std::cout << "Before move, one = \"" << one.str() << '"'
              << " two = \"" << two.str() << "\"" << std::endl;

    //交换 *this 和 rhs 的状态与内容。
    one.swap(two);

    std::cout << "After swap, one = \"" << one.str() << '"'
              << " two = \"" << two.str() << "\"" << std::endl;

    return 0;
}

输出

 

替换或获得关联字符串的副本

std::basic_stringbuf<CharT,Traits,Allocator>::str

std::basic_string<CharT, Traits, Allocator> str() const;

(1)

void str( const std::basic_string<CharT, Traits, Allocator>& s);

(2)

获取和设置底层字符串。

1) 创建并返回保有此 std::basic_stringbuf 底层字符序列副本的 std::basic_string 。对于仅输入流,返回的字符串含来自范围 [eback(), egptr()) 的字符。对于输入/输出或仅输出流,含有 pbase() 到序列中末字符的字符,不考虑 egptr() 和 epptr() 。

为写入打开的缓冲区中的成员字符序列能为效率目的过分配。该情况下,仅返回初始化的字符:从构造函数 string 参数获得的字符、最近对 str() 的第二重载的 string 参数的字符或来自写入操作的字符。典型的使用过分配的实现维护一个高水位指针,以跟踪缓冲区已初始化部分的结尾,而此重载返回从 pbase() 到高水位指针的字符。

(C++11 起)

2) 删除此 std::basic_stringbuf 的整个底层字符序列,然后配置新的含有 s 内容副本的底层字符序列。以下列方式初始化 std::basic_streambuf 的指针:

  • 对于输入流( mode & ios_base::in == true ), eback() 指向首字符, gptr() == eback() ,而 egptr() == eback() + s.size() :后继输入将读取首个复制自 s 的字符。
  • 对于输出流( mode & ios_base::out == true ), pbase() 指向首字符而 epptr() >= pbase() + s.size() (允许 epptr 指向更远以令后随的 sputc() 不会立即调用 overflow()
    • 对于后附流( mode & ios_base::ate == true ), pptr() == pbase() + s.size() ,从而后继输出将被后附到复制自 s 的最后字符。(C++11 起)
    • 对于非后附输出流, pptr() == pbase() ,从而后继输出将重写复制自 s 的字符。

参数

s-保有替换字符序列的 string 对象

返回值

1) 保有此缓冲的底层字符序列副本的 string 对象。

2) (无)

注意

此函数典型地通过 std::basic_stringstream::str() 访问。

 调用示例

#include <sstream>
#include <string>
#include <iostream>

int main()
{
    char n;

    std::basic_stringbuf<char> in;  // 亦能用 in("1 2")
    in.str("1 2"); // 设置获取区
    n = in.sgetc();
    std::cout << "after reading the first char from \"1 2\", the char is "
              << n << ", str() = \"" << in.str() << "\"" << std::endl; // 或 in.str()

    std::basic_stringbuf<char> out("1 2");
    out.sputc('3');
    std::cout << "after writing the char '3' to output stream \"1 2\""
              << ", str() = \"" << out.str() << "\"" << std::endl;

    return 0;
}

输出

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/879893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

location rewrite

Nginx location 匹配的规则和优先级 Nginx常用的变量 rewrite: 重定向功能 Location 匹配 URI URI&#xff1a;统一资源的表示符&#xff0c;是一种字符串标识&#xff0c;用于标识抽象或者物理资源 先来巩固一些与location结合使用的正则表达式 正则表达式&#xff1a;匹…

【833. 字符串中的查找与替换】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 你会得到一个字符串 s (索引从 0 开始)&#xff0c;你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出&#xff1a;indices, sources, targets。 要完成第 i 个替换操作: 检查…

数据结构:堆的实现

1.堆的概念 如果有一个关键码的集合 K { k1 &#xff0c;k2 &#xff0c;k3 &#xff0c;…&#xff0c;kn }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并且 k(i) < k(i*21) 和 k(i) < k(i*22)&#xff0c; i 0 &#xff…

人机融合中态、势、感、知的嵌套与级联

态、势、感、知四部分的嵌套与级联可以被看作是一种综合、协同的感知模式&#xff0c;它们相互作用并相互支持&#xff0c;共同构成了全面的态势感知能力。 "态"指的是事物或系统的状态或状况。它可以包括各种要素&#xff0c;如环境、情况、情绪等。态势感知中的“态…

vue中实现订单支付倒计时

需求 创建订单后15分钟内进行支付&#xff0c;否则订单取消。 实现 思路&#xff1a; 获取订单创建时间、在创建时间的基础上增加15分钟作为结束时间&#xff08;倒计时多久根据自己的实际需求&#xff0c;这里为15分钟&#xff09;&#xff0c;两时间戳相减获取间隔的毫秒数…

春秋云镜 CVE-2021-41947

春秋云镜 CVE-2021-41947 Subrion CMS v4.2.1 存在sql注入 靶标介绍 Subrion CMS v4.2.1 存在sql注入。 启动场景 漏洞利用 exp http://localhost/panel/visual-mode.json?getaccess&typeblocks UNION ALL SELECT username, password FROM sbr421_members -- -&o…

Vue学习之条件渲染

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>条件渲染</title><!--引入Vue--><script type"text/javascript" src"../vue.js"></script></head><body><!--…

Qt 屏幕偶发性失灵

项目场景: 基于NXP i.mx7的Qt应用层项目开发,通过goodix使用触摸屏,走i2c协议。 问题描述 触摸屏使用过程中意外卡死,现场分为多种: i2c总线传输错误,直观表现为触摸屏无效,任何与触摸屏挂接在同一总线上的i2c设备,均受到干扰,并且在传输过程中内核报错以下代码: G…

MAC环境,在IDEA执行报错java: -source 1.5 中不支持 diamond 运算符

Error:(41, 51) java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符) 进入设置 修改java版本 pom文件中加入 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin&l…

常见侧信道攻击方法

侧信道攻击方法需要采集到密码设备的能量泄露信息然后建立对应的能量消耗模型&#xff0c;之后使用特定的攻击方法来破解密钥。常见的侧信道攻击方法有简单能量&#xff08;或电磁&#xff09;攻击&#xff08;SPA&#xff09;、差分功耗&#xff08;或电磁&#xff09;攻击&am…

idea打jar包

目录 1、打包设置 2、打包介绍 3、开始打包 1、打包设置 先设置要打包的模块信息&#xff0c;即打包进去的内容。如下图所示&#xff1a;File --> Project Structure --> Artifacts&#xff0c;点击&#xff0b;号完成模块创建&#xff0c;其中有两种方式&#xff1a;…

【C++】STL---vector

STL---vector 一、vector 的介绍二、vector 的模拟实现1. 容量相关的接口&#xff08;1&#xff09;size&#xff08;2&#xff09;capacity&#xff08;3&#xff09;reserve&#xff08;4&#xff09;resize&#xff08;5&#xff09;empty 2. [] 重载3. 迭代器4. 修改数据相…

【二开】jeecgboot 开发过程方法扩展二开整理

【二开】jeecgboot 开发过程方法扩展二开整理 org.jeecg.modules.system.controller.CommonController#upload 可以二开统一文件上传 返回值增加文件大小 跟文件名称 //自定义 图片前缀savePath jeecgBaseConfig.getUploadRequestHost() savePath;if(oConvertUtils.isNotEm…

选择任务管理软件:哪个更适合你的需求?

随着互联网的发展&#xff0c;知识管理是可以成为企业获得更大发展前景的神兵利器&#xff0c;任务协同&#xff0c;是服务于中小型团队&#xff0c;或者大型机构的终端组织。来看看这款国外流行的任务管理软件Zoho Projects。 任务管理是企业协同的重要组成部分。 任务管理是企…

如何正确下载tomcat???

亲爱的小伙伴&#xff0c;千万别再去找下网站下载啦&#xff0c;这样詪容易携带病毒。 我们去官方网址下载。 Apache Tomcat - Welcome! 最后下载解压即可。。。

免费机器人来了(基于有限状态机),快来体验下

免费有限状态机机器人来了,快来体验下 51jiqiren.cn 五分钟就可以完成一个简单的机器人. 懂json的同学可以自定义状态和状态跳转,完成复杂的业务流程. 更多功能还在开发中. 网站右下角点"联系客服"截图: 弹出来了: 后端管理界面: 有限状态机界面: 数据界面: 在网…

论文复现--关于单视角动作捕捉工具箱--MMHuman3d的研究(基于Windows10和Linux18.04中配置)

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/open-mmlab/mmhuman3d 所需环境&#xff1a; Windows10&#xff0c;CUDA11.6&#xff0c;conda 4.13.0&#xff0c;Visual Studio 2017&#xff1b; Ubuntu18.04&#xff0c;conda22.9.0&#xff0c;CUDA11…

企业网盘 vs 传统存储设备:为何云存储成为首选?

企业网盘的出现为企业提供了新的存储方式&#xff0c;相较于传统的存储设备&#xff0c;为何越来越多的企业选择了云存储呢&#xff1f; 一、存储成本 在企业数据存储方面&#xff0c;成本是企业重要的考量因素。企业网盘是基于云存储技术的存储工具&#xff0c;因此它比传统的…

算法(第4版)练习题 1.1.27 的三种解法

本文列举了对于 算法 : 第4版 / (美) 塞奇威客 (Sedgewick, R.) , (美) 韦恩 (Wayne, K.) 著 ; 谢路云译. -- 北京 : 人民邮电出版社, 2012.10 (2021.5重印)&#xff08;以下简称原书或书&#xff09;中的练习题 1.1.27 的三种解法&#xff08;C 实现&#xff09;&#xff0c;并…

朴素贝叶斯(右心室肥厚的辅助识别)

现在我们判断右心室是否肥厚通常的做法都是借助心电图来识别&#xff0c;左侧的是右心室肥厚的&#xff0c;右侧的是右心室厚度正常&#xff0c;那接下来就要按照给出的图像来处理特征&#xff0c;提取出正常组和肥厚组的不同特征。 根据上图我们可以得出通过图像提取出了年龄…