处理数字的流对象

时间:2014-05-26 07:33:58

标签: c++ stl stream bytestream

这可能是一个非常基本的问题,但在挖掘STL参考时,我找不到合适的东西。作为一个例子

std::ostringstream oss;
oss << "One hundred and one: " << 101;

会导致One hundred and one: 101存储在oss中,意味着数值101会转换为文本。我正在寻找的是一个流对象,它保持数值,如下所示:

numstream nums;
nums << 10 << 0 << 15;

会导致字节或字符串缓冲区不包含10015的文本表示形式,而只包含这三个数字。

知道可以用于什么吗?

2 个答案:

答案 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机制实际上是要处理插入的单个字符/除去。