std::basic_stringbuf<CharT,Traits,Allocator>:: str
From cppreference.net
<
cpp
|
io
|
basic stringbuf
| (1) | ||
|
std::
basic_string
<
CharT, Traits, Allocator
>
str
(
)
const
;
|
(C++20 前) | |
|
std::
basic_string
<
CharT, Traits, Allocator
>
str
(
)
const
&
;
|
(C++20 起) | |
|
template
<
class
SAlloc
>
std:: basic_string < CharT, Traits, SAlloc > str ( const SAlloc & a ) const ; |
(2) | (C++20 起) |
|
std::
basic_string
<
CharT, Traits, Allocator
>
str
(
)
&&
;
|
(3) | (C++20 起) |
|
void
str
(
const
std::
basic_string
<
CharT, Traits, Allocator
>
&
s
)
;
|
(4) | |
|
template
<
class
SAlloc
>
void str ( const std:: basic_string < CharT, Traits, SAlloc > & s ) ; |
(5) | (C++20 起) |
|
void
str
(
std::
basic_string
<
CharT, Traits, Allocator
>
&&
s
)
;
|
(6) | (C++20 起) |
|
template
<
class
StringViewLike
>
void str ( const StringViewLike & t ) ; |
(7) | (C++26 起) |
获取并设置底层字符串。
在以下描述中, buf 和 mode 是 * this 的 仅用于说明的数据成员 。
1)
创建并返回一个包含此
std::basic_stringbuf
底层字符序列副本的
std::basic_string
对象。对于仅输入流,返回的字符串包含范围
[
eback()
,
egptr()
)
内的字符。对于输入/输出或仅输出流,包含从
pbase()
到序列中最后一个字符的所有字符,不受
egptr()
和
epptr()
的影响。
-
-
为提升效率,以写入模式打开的缓冲区中的成员字符序列可能被过量分配。此时仅返回
已初始化的字符
:这些字符来自构造函数的字符串参数、最近一次调用
str()的setter重载时的字符串参数,或来自写入操作。典型的使用过量分配的实现会维护一个高水位标记指针来追踪缓冲区初始化部分的末尾,此重载返回从 pbase() 到高水位标记指针之间的字符。
-
为提升效率,以写入模式打开的缓冲区中的成员字符序列可能被过量分配。此时仅返回
已初始化的字符
:这些字符来自构造函数的字符串参数、最近一次调用
|
(C++20 起) |
2)
与
(1)
相同,区别在于使用
a
构造返回的
std::basic_string
。等价于
return
std::
basic_string
<
CharT, Traits, SAlloc
>
(
view
(
)
, a
)
;
。
3)
创建一个
std::basic_string
对象,方式类似于通过从
*
this
的底层字符序列移动构造。首先可能需要调整
buf
以包含与
(1)
中相同的内容。之后,将
buf
设置为空并调用
init_buf_ptrs
()
,然后返回该
std::basic_string
对象。
5)
与
(4)
相同,但
s
的分配器类型不是
Allocator
。
7)
隐式转换
t
为字符串视图
sv
,如同通过
std::
basic_string_view
<
CharT, Traits
>
sv
=
t
;
,随后替换底层字符序列如同通过
buf
=
sv
,最后调用
init_buf_ptrs
()
。
此重载仅当
std::
is_convertible_v
<
const
StringViewLike
&
,
std:: basic_string_view < CharT, Traits >> 为 true 时参与重载决议。
std:: basic_string_view < CharT, Traits >> 为 true 时参与重载决议。
目录 |
参数
| s | - | 持有替换字符序列的 std::basic_string 对象 |
| t | - | 持有替换字符序列的对象(可转换为 std::basic_string_view ) |
| a | - | 用于返回的 std::basic_string 所有内存分配的分配器 |
返回值
1-3)
持有此缓冲区底层字符序列的
std::basic_string
对象。
4-7)
(无)
注释
此函数通常通过 std::basic_istringstream::str() 、 std::basic_ostringstream::str() 或 std::basic_stringstream::str() 进行访问。
| 特性测试宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_sstream_from_string_view
|
202306L
|
(C++26) | 字符串流与 std::string_view 的交互操作 |
示例
运行此代码
#include <iostream> #include <sstream> int main() { int n; std::istringstream in; // 也可使用 in("1 2") in.rdbuf()->str("1 2"); // 设置获取区域 in >> n; std::cout << "从 \"1 2\" 读取第一个整数后,该整数为 " << n << ", str() = \"" << in.rdbuf()->str() << "\"\n"; // 或使用 in.str() std::ostringstream out("1 2"); out << 3; std::cout << "向输出流 \"1 2\" 写入整数 '3' 后" << ", str() = \"" << out.str() << "\"\n"; std::ostringstream ate("1 2", std::ios_base::ate); // C++11 ate << 3; std::cout << "向追加流 \"1 2\" 写入整数 '3' 后" << ", str() = \"" << ate.str() << "\"\n"; }
输出:
从 "1 2" 读取第一个整数后,该整数为 1, str() = "1 2" 向输出流 "1 2" 写入整数 '3' 后, str() = "3 2" 向追加流 "1 2" 写入整数 '3' 后, str() = "1 23"
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 432 | C++98 |
1. 重载
(1)
未指定底层字符序列的内容
2. 重载 (4) 未指定输入输出序列的初始化方式 |
均已明确指定 |
| LWG 562 | C++98 |
重载
(4)
在
bool
(
mode
&
std::
ios_base
::
out
)
==
true
时将
epptr() 设置为指向最后一个底层字符之后的位置 |
epptr()
可设置
超越该位置 |
参见
|
获取或设置底层字符串设备对象的内容
(
std::basic_stringstream<CharT,Traits,Allocator>
的公开成员函数)
|
|
|
(C++20)
|
获取底层字符序列的视图
(公开成员函数) |