字符串流的部分副本

Partial copy of a stringstream

如何将以str1的第二个字符开头的三个字符复制到str2?此代码无效:

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>

int main()
{
  std::stringstream str1("0123456789");
  std::stringstream str2;

  str1.seekg(1, str1.beg);

  std::copy(std::istream_iterator<char>(str1), std::istream_iterator<char>(str1)+3, std::ostream_iterator<char>(str2));
  std::cout << str2.str() << '\n';
}

预期输出为:

123

这是一个虚拟测试,但我想使用更大的 stringstreams 和高效的方法。

使用 substr()std::string。要将它用于 std::stringstream 使用 str1.str() 然后赋值给str::stringstr2.

第 1 步:获取 std::stringstream.

的字符串 our

第 2 步:对 std::string.

执行操作

第 3 步:将字符串分配给 std::stringstream

获取字符串流部分的其他方法:

char c[10] = {};
std::istringstream input("This is sample text."); // std::stringbuf makes its entire
                                                  // buffer available for unblocking read
input.readsome(c, 5); // reads 'This ' and stores in c[0] .. c[4]
input.readsome(c, 9); // reads 'is sample' and stores in c[0] .. c[8]

还有另一种名为 std::copy_n 的标准库算法可以满足您的要求。它需要一个开始迭代器和要复制的元素数。如果您将 std::copy 行更改为:

,您的程序就会运行
std::copy_n(std::istream_iterator<char>(str1), 3, std::ostream_iterator<char>(str2));

Demo on Compiler Explorer

一个改进可能是使用 std::next 而不是 seekg() 来将第一个迭代器推进到所需的偏移量(感谢 Armin Montigny)。看起来像:

std::copy_n(std::next(std::istream_iterator<char>(str1)), 3, std::ostream_iterator<char>(str2));