将 stringstream 转换为 stl 容器
converting stringstream to stl containers
我想将一些字符串流转换为矢量,但在转换过程中我丢失了所有空格。
class Wrapper {
public:
vector<char> data;
Wrapper(std::stringstream &s) {
std::cout << s.str(); //output: 22 serialization::archive 16 0 0 2
for (char c; s >> c;)
data.push_back(c);
std::cout << '\n';
for (auto i = data.begin(); i != data.end(); ++i)
std::cout << *i; // output: 22serialization::archive1600222
}
};
...
new Wrapper(stream);
而且我的对话方式看起来也不优雅。有更好的方法吗?
如 Some programmer dude 评论中所述,operator>>
默认跳过空格。
可以使用适当的重载和几个 std::istreambuf_iterator
直接从 std::stringstream
构造 std::vector<char>
:
#include <iostream>
#include <vector>
#include <sstream>
#include <iterator>
int main(void)
{
std::stringstream ss;
ss << 22 << " serialization::archive " << 16 << ' ' << 0 << ' ' << 0 << ' ' << 2;
std::vector<char> data {
std::istreambuf_iterator<char>(ss),
std::istreambuf_iterator<char>(), // <- default-constructed end of stream iterator
};
// it outputs: 22 serialization::archive 16 0 0 2
for (auto i = data.begin(); i != data.end(); ++i)
std::cout << *i;
}
我想将一些字符串流转换为矢量,但在转换过程中我丢失了所有空格。
class Wrapper {
public:
vector<char> data;
Wrapper(std::stringstream &s) {
std::cout << s.str(); //output: 22 serialization::archive 16 0 0 2
for (char c; s >> c;)
data.push_back(c);
std::cout << '\n';
for (auto i = data.begin(); i != data.end(); ++i)
std::cout << *i; // output: 22serialization::archive1600222
}
};
...
new Wrapper(stream);
而且我的对话方式看起来也不优雅。有更好的方法吗?
如 Some programmer dude 评论中所述,operator>>
默认跳过空格。
可以使用适当的重载和几个 std::istreambuf_iterator
直接从 std::stringstream
构造 std::vector<char>
:
#include <iostream>
#include <vector>
#include <sstream>
#include <iterator>
int main(void)
{
std::stringstream ss;
ss << 22 << " serialization::archive " << 16 << ' ' << 0 << ' ' << 0 << ' ' << 2;
std::vector<char> data {
std::istreambuf_iterator<char>(ss),
std::istreambuf_iterator<char>(), // <- default-constructed end of stream iterator
};
// it outputs: 22 serialization::archive 16 0 0 2
for (auto i = data.begin(); i != data.end(); ++i)
std::cout << *i;
}