字符串流的部分副本

问题描述 投票:1回答:2

如何将以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和高效的方法。

c++ c++11 stream stringstream
2个回答
2
投票

还有另一种称为std::copy_n的标准库算法,它将执行您想要的操作。它需要一个开始迭代器和要复制的元素数。如果将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将第一个迭代器前进到所需的偏移量(感谢Armin Montigny)。看起来像:

std::next

0
投票

使用seekg()std::copy_n(std::next(std::istream_iterator<char>(str1)), 3, std::ostream_iterator<char>(str2)); 。要将它用于substr(),请使用str1.str()然后将其分配给std::string str2。

© www.soinside.com 2019 - 2024. All rights reserved.