CppDS.com

C++ 98 11 14 17 20 手册

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

来自cppreference.com
< 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, Allocator> 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 起)

获取和设置底层字符串。

为解释目的,令 buf_ 代表保有底层字符序列的内部 std::basic_string 对象。定义缓冲指针初始化如下:

  • 对于输入流( bool(mode & std::ios_base::in) == true ),使 eback() 指向首字符, gptr() == eback() ,而 egptr() == eback() + buf_.size() :后继输入将读取首个字符串的字符。
  • 对于输出流( bool(mode & std::ios_base::out) == true ),使 pbase() 指向首字符而 epptr() >= pbase() + buf_.size() (允许 epptr() 指向更后,以令后随的 sputc() 不会立即调用 overflow()
  • 对于后附流( bool(mode & std::ios_base::ate) == true ),使 pptr() == pbase() + buf_.size() ,从而后继输出将被后附到字符串的最后字符。
(C++11 起)
  • 对于非后附输出流,使 pptr() == pbase() ,从而后继输出将重写字符串的字符。
1) 创建并返回保有此 std::basic_stringbuf 底层字符序列副本的 std::basic_string 。对于仅输入流,返回的字符串含来自范围 [eback(), egptr()) 的字符。对于输入/输出或仅输出流,含有 pbase() 到序列中末字符的字符,不考虑 egptr()epptr()

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

(C++11 起)

等价于 return std::basic_string<CharT, Traits, Allocator>(view(), get_allocator());

(C++20 起)
2)(1) ,除了用 a 构造返回的 std::basic_string 。等价于 return std::basic_string<CharT, Traits, SAlloc>(view(), a); 。此重载仅若 SAlloc 满足分配器 (Allocator) 的要求才参与重载决议。
3) 创建 std::basic_string 对象,如同以 std::move(buf_) 初始化。可能需要首先调节 buf_ 以使之含有同 (1) 的内容。构造该 std::basic_string 对象后,设置 buf_ 为空并进行缓冲指针初始化,然后返回 std::basic_string 对象。
4) 如同用 buf_ = s 替换底层字符序列,然后进行缓冲指针初始化。
5)(4) ,除了 s 的分配器的类型不是 Allocator 。此重载仅若 SAllocAllocator 不是同一类型才参与重载决议。
6) 如同用 buf_ = std::move(s) 替换底层字符序列,然后进行缓冲指针初始化。

参数

s - 保有替换字符序列的 basic_string 对象
a - 返回的 basic_string 的所有内存分配所用的分配器

返回值

1-3) 保有此缓冲的底层字符序列的 basic_string 对象。
4-6) (无)

注解

常通过 std::basic_istringstream::str()std::basic_ostringstream::str()std::basic_stringstream::str() 访问此函数。

示例

#include <sstream>
#include <iostream>
int main()
{
    int n;
 
    std::istringstream in;  // 亦能用 in("1 2")
    in.rdbuf()->str("1 2"); // 设置获取区
    in >> n;
    std::cout << "after reading the first int from \"1 2\", the int is " 
              << n << ", str() = \"" << in.rdbuf()->str() << "\"\n"; // 或 in.str()
 
    std::ostringstream out("1 2");
    out << 3;
    std::cout << "after writing the int '3' to output stream \"1 2\""
              << ", str() = \"" << out.str() << "\"\n";
 
    std::ostringstream ate("1 2", std::ios_base::ate); // C++11
    ate << 3;
    std::cout << "after writing the int '3' to append stream \"1 2\""
              << ", str() = \"" << ate.str() << "\"\n";
}

输出:

after reading the first int from "1 2", the int is 1, str() = "1 2"
after writing the int '3' to output stream "1 2", str() = "3 2"
after writing the int '3' to append stream "1 2", str() = "1 23"

参阅

获取或设置底层字符串设备对象的内容
(std::basic_stringstream<CharT,Traits,Allocator> 的公开成员函数)
(C++20)
获得底层字符序列上的视图
(公开成员函数)
关闭