当前位置: 首页 > news >正文

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

定义于头文件 <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;
}

输出

 

相关文章:

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

定义于头文件 <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…...

Nodejs 第九章(模块化)

Nodejs 模块化规范遵循两套一 套CommonJS规范另一套esm规范 CommonJS 规范 引入模块&#xff08;require&#xff09;支持四种格式 支持引入内置模块例如 http os fs child_process 等nodejs内置模块支持引入第三方模块express md5 koa 等支持引入自己编写的模块 ./ …/ 等支…...

shell之正则表达式及三剑客grep命令

一、正则表达式概述 什么是正则表达式&#xff1f; 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式&#xff0c;又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 正则表达式 普通字符&#xff1a; 大小写字母…...

LeetCode 热题 100 JavaScript--33. 搜索旋转排序数组

整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nums[1], …,…...

并发编程 - 线程池中的常见面试题

目录 1. 线程池相比于线程有什么优点 2. 线程池的参数有哪些 3. 线程工厂有什么用 4. 说一下线程的优先级 5. 说一下线程池的执行流程 6. 线程池的拒绝策略有哪些 7. 如何实现自定义拒绝策略 8. 如何判断线程池中的任务是否执行完成 1. 线程池相比于线程有什么优点 有…...

将多个单独的 Excel 文件合并成一个,并添加标题行

要将多个单独的 Excel 文件合并成一个&#xff0c;并添加标题行&#xff0c;可以使用 Python 的 pandas 库。以下是一个示例代码&#xff0c;假设要合并的 Excel 文件都在同一个文件夹中&#xff1a; import os import pandas as pd # 指定文件夹路径 folder_path path/to/fo…...

VPN pptp和l2tp协议破解

代码下载地址&#xff1a; https://download.csdn.net/download/m0_37567738/88215516?spm1001.2014.3001.5501...

4.3、Flink任务怎样读取Kafka中的数据

目录 1、添加pom依赖 2、API使用说明 3、这是一个完整的入门案例 4、Kafka消息应该如何解析 4.1、只获取Kafka消息的value部分 ​4.2、获取完整Kafka消息(key、value、Metadata) 4.3、自定义Kafka消息解析器 5、起始消费位点应该如何设置 ​5.1、earliest() 5.2、lat…...

C语言实例_和校验算法

一、算法介绍 和校验&#xff08;Checksum&#xff09;是一种简单的纠错算法&#xff0c;用于检测或验证数据传输或存储过程中的错误。它通过对数据进行计算并生成校验和&#xff0c;然后将校验和附加到数据中&#xff0c;在接收端再次计算校验和并进行比较&#xff0c;以确定…...

安全加密框架图——Oracle安全开发者

Oracle安全开发者 ACLs 设计 ACLs&#xff08;访问控制列表&#xff09;时&#xff0c;可以根据以下思路进行设计&#xff1a; 所有者文件权限&#xff1a;确定文件的所有者能够对文件执行哪些操作&#xff0c;如读取、写入、执行等。这可以根据文件的性质和拥有者的职责来决…...

Android databinding 被多次定义

一、报错&#xff1a; AndroidStudio运行代码时&#xff0c;编译器报 Type androidx.databinding.Bindable is defined multiple times...... 二、解决&#xff1a; 点击 Build -> Clean Project&#xff0c;关闭编译器再打开即可。 三、解决过程&#xff1a; 在使用Andro…...

云原生周刊:Kubernetes v1.28 新特性一览 | 2023.8.14

推荐一个 GitHub 仓库&#xff1a;Fast-Kubernetes。 Fast-Kubernetes 是一个涵盖了 Kubernetes 的实验室&#xff08;LABs&#xff09;的仓库。它提供了关于 Kubernetes 的各种主题和组件的详细内容&#xff0c;包括 Kubectl、Pod、Deployment、Service、ConfigMap、Volume、…...

机器学习之分类模型

机器学习之分类模型 概述分类模型逻辑回归最近邻分类朴素贝叶斯支持向量机决策树随机森林多层感知机基于集成学习的分类模型VotingBaggingStackingBlendingBoosting 概述 机器学习分类模型通过训练集进行学习&#xff0c;建立一个从输入空间 X X X到输出空间 Y Y Y&#xff08…...

学习Vue:创建第一个Vue实例

当您开始探索 Vue.js&#xff0c;第一步就是创建一个 Vue 实例。Vue 实例是 Vue.js 应用程序的核心构建块&#xff0c;它使您能够将数据与用户界面连接起来&#xff0c;实现动态交互。在本文中&#xff0c;我们将详细介绍如何创建您的第一个 Vue 实例。 步骤1&#xff1a;引入 …...

JavaFx基础学习【二】:Stage

一、介绍 窗口Stage为图中标绿部分&#xff1a; 实际为如下部分&#xff1a; 不同的操作系统表现的样式不同&#xff0c;以下都是以Windows操作系统为例&#xff0c;为了使大家更清楚Stage是那部分&#xff0c;直接看以下图&#xff0c;可能更清楚&#xff1a; 有点潦草&…...

C语言——动态内存函数(malloc、calloc、realloc、free)

了解动态内存函数 前言&#xff1a;一、malloc函数二、calloc函数三、realloc函数四、free函数 前言&#xff1a; 在C语言中&#xff0c;动态内存函数是块重要的知识点。以往&#xff0c;我们开辟空间都是固定得&#xff0c;数组编译结束后就不能继续给它开辟空间了&#xff0…...

Redis数据结构——Redis简单动态字符串SDS

定义 众所周知&#xff0c;Redis是由C语言写的。 对于字符串类型的数据存储&#xff0c;Redis并没有直接使用C语言中的字符串。 而是自己构建了一个结构体&#xff0c;叫做“简单动态字符串”&#xff0c;简称SDS&#xff0c;比C语言中的字符串更加灵活。 SDS的结构体是这样的…...

【计算机网络】TCP协议超详细讲解

文章目录 1. TCP简介2. TCP和UDP的区别3. TCP的报文格式4. 确认应答机制5. 超时重传6. 三次握手7. 为什么两次握手不行?8. 四次挥手9. 滑动窗口10. 流量控制11. 拥塞控制12. 延时应答13. 捎带应答14. 面向字节流15. TCP的连接异常处理 1. TCP简介 TCP协议广泛应用于可靠性要求…...

Salesforce特别元数据部署技巧

标准的picklist字段部署 <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <Package xmlns"http://soap.sforce.com/2006/04/metadata"><types><members>Opportunity.StageName</members><…...

[前端系列第2弹]CSS入门教程:从零开始学习Web页面的样式和布局

在这篇文章中&#xff0c;我将介绍CSS的基本概念、语法、选择器、属性和值&#xff0c;以及如何使用它们来定义Web页面的外观和布局。还将给一些简单而实用的例子&#xff0c;可以跟着我一步一步地编写自己的CSS样式表。 目录 一、什么是CSS 二、CSS的语法 三、CSS的选择器 …...

C++信号量实战:如何用Semaphore解决多线程打印ABC问题(附完整代码)

C信号量实战&#xff1a;如何用Semaphore解决多线程打印ABC问题&#xff08;附完整代码&#xff09; 多线程编程中&#xff0c;同步机制的选择往往决定了程序的性能和可靠性。信号量&#xff08;Semaphore&#xff09;作为一种经典的同步原语&#xff0c;在解决特定类型的问题时…...

西门子1500T插补控制从入门到精通:手把手教你配置直线与圆弧轨迹(附程序源码)

西门子1500T插补控制从入门到精通&#xff1a;手把手教你配置直线与圆弧轨迹&#xff08;附程序源码&#xff09; 在工业自动化领域&#xff0c;精确控制多轴协同运动一直是核心挑战。想象一下机械臂需要画一个完美的圆&#xff0c;或者CNC机床要切割复杂曲线——这些场景都离不…...

ICLR 2025 技术趋势解码:大模型优化与生成式AI的协同演进

1. 大模型优化的三大技术路线 过去一年我测试了超过20种大模型优化方案&#xff0c;发现当前技术演进主要集中在三个方向&#xff1a;参数压缩、训练加速和推理优化。先说最让我惊喜的轻量化技术&#xff0c;去年帮某电商客户把70B参数的客服模型压缩到3.8G大小&#xff0c;在移…...

传感器与变送器:工业自动化的感知与信号处理核心

1. 传感器与变送器的核心差异解析在工业自动化领域&#xff0c;传感器和变送器就像人的感官神经与语言翻译系统。传感器如同触觉、视觉等感官末梢&#xff0c;直接感知外界物理量变化&#xff1b;而变送器则像专业的同声传译&#xff0c;将原始感知信息转化为标准化的表达方式。…...

OpenClaw龙虾实用使用教程:一键安装工具分享,教“员工”上手,解锁你想要的效果

很多人安装完OpenClaw龙虾后&#xff0c;都会和我当初一样陷入一个误区&#xff1a;以为点击启动就能实现自己想要的功能&#xff0c;结果发现龙虾“无所适从”。其实OpenClaw龙虾就像一位新员工——它本身具备强大的潜力&#xff0c;但需要你耐心教导、提供足够的“资料”&…...

ModTheSpire终极指南:5个技巧让杀戮尖塔模组加载零烦恼

ModTheSpire终极指南&#xff1a;5个技巧让杀戮尖塔模组加载零烦恼 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 厌倦了每次想体验新模组都要手动修改游戏文件的繁琐操作吗&#xff…...

Amadeus的知识库 | 告别碎片化集成:深度解析 AI 时代的“USB 协议” —— MCP

一、引文在 LLM&#xff08;大语言模型&#xff09;飞速发展的今天&#xff0c;我们正从“对话框 AI”转向“智能体&#xff08;Agent&#xff09;”。然而&#xff0c;开发者在集成 AI 时一直面临一个巨大的痛点&#xff1a;数据孤岛。为了解决这个问题&#xff0c;Anthropic …...

电机类型详解与选型维护指南

1. 电机基础概念解析电机作为现代工业的核心动力装置&#xff0c;其重要性不言而喻。简单来说&#xff0c;电机就是通过电磁感应原理实现电能与机械能相互转换的设备。想象一下&#xff0c;它就像一个能量翻译官&#xff0c;把电这种看不见的能量形式&#xff0c;翻译成我们看得…...

CVPR 2026 | 武大提出OpenDPR:基于扩散模型的开放词汇变化检测模型

点击下方卡片&#xff0c;关注“CVer”公众号AI/CV重磅干货&#xff0c;第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号&#xff1a;CVer2233&#xff0c;小助手拉你进群&#xff01;扫描下方二维码&#xff0c;加入CVer学术星球&#xff01;可以获得最新顶会/顶…...

魔兽争霸III优化终极指南:WarcraftHelper插件完整使用教程

魔兽争霸III优化终极指南&#xff1a;WarcraftHelper插件完整使用教程 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在现代电脑上…...