这可能是一个非常基本的问题,但在挖掘STL参考时,我找不到合适的东西。作为一个例子
std::ostringstream oss;
oss << "One hundred and one: " << 101;
会导致One hundred and one: 101
存储在oss
中,意味着数值101
会转换为文本。我正在寻找的是一个流对象,它保持数值,如下所示:
numstream nums;
nums << 10 << 0 << 15;
会导致字节或字符串缓冲区不包含10
,0
和15
的文本表示形式,而只包含这三个数字。
知道可以用于什么吗?
答案 0 :(得分:1)
包含整数序列的缓冲区是std::vector<int>
控件。
您可以覆盖要追加的全局运算符<<
对此类操作所属的任何容器类型T
的任何类型C
有意义的:
#include <vector>
#include <iostream>
std::vector<int> & operator<<(std::vector<int> & vi, int i)
{
vi.push_back(i);
return vi;
}
int main()
{
std::vector<int> vi;
vi << 1 << 2 << 3;
for(auto i : vi) {
std::cout << i << std::endl;
}
return 0;
}
但是,如果您要实现的 all 是缩写,例如
si.push_back(i);
对于某些整数序列si
和int i
,并且能够缩短,例如
si.push_back(i);
si.push_back(j);
si.push_back(k);
为:
si << i << j << k;
请记住,你获得的简洁是以牺牲成本为代价的 让熟练的读者研究你的缩写是什么 - 他们有多安全。
我建议将si.push_back(i)
缩短为si << i
是不值得的
并且如果你想要将push_back(n)
的长序列放在上面
一行然后它就足够了,并且不那么古怪
用于此目的的类型安全的可变参数函数模板,例如
void push_back(std::vector<int> & vi){}
template<typename ...Ts>
void push_back(std::vector<int> & vi, int i, Ts... ts)
{
vi.push_back(i);
if (sizeof...(Ts)) {
push_back(vi,ts...);
}
}
你要写的,例如
push_back(si,i,j,k);
而不是:
si << i << j << k;
答案 1 :(得分:0)
使用这种语义(流插入):没有没有&#t; t。
从您的示例中看起来您想要用整数填充整数向量。
你需要一个仿函数(ostream操纵器),它将类似ostream的语义转换为vector-element-addition。
有些事情:
struct functor {
functor(std::vector<int>& viref):
myVector(viref)
{}
// this operator overload translates stream-insert operator
// into vector element addition
functor& operator<<(const int i) {
myVector.push_back(i);
return *this;
}
std::vector<int>& myVector;
};
int main() {
std::vector<int> vi;
functor f( vi );
f << 1 << 2 << 3;
}
或者,您总是可以编写自己的streambuffer类(http://www.cplusplus.com/reference/streambuf/streambuf/),但我怀疑这会很好,因为整个字符串/流buf机制实际上是要处理插入的单个字符/除去。