字符串流的部分副本
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::string
str2.
第 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));
一个改进可能是使用 std::next
而不是 seekg()
来将第一个迭代器推进到所需的偏移量(感谢 Armin Montigny)。看起来像:
std::copy_n(std::next(std::istream_iterator<char>(str1)), 3, std::ostream_iterator<char>(str2));
如何将以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::string
str2.
第 1 步:获取 std::stringstream
.
第 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));
一个改进可能是使用 std::next
而不是 seekg()
来将第一个迭代器推进到所需的偏移量(感谢 Armin Montigny)。看起来像:
std::copy_n(std::next(std::istream_iterator<char>(str1)), 3, std::ostream_iterator<char>(str2));