2

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

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

将导致One hundred and one: 101存储在 中oss,表示将数值101转换为文本。我正在寻找的是一个保持数值的流对象,例如:

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

将导致一个字节或字符串缓冲区不包含 的文本表示10015仅包含这三个数字。

知道什么可以用来做这个吗?

4

2 回答 2

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;
}

但是,如果想要实现的只是一个缩写,例如

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;
于 2014-05-26T10:18:39.167 回答
0

有了这个语义(流插入):不,没有。

从您的示例中,您似乎想用整数填充整数向量。

您将需要一个仿函数(ostream 操纵器),它将类似 ostream 的语义转换为向量元素加法。

类似于以下内容:

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;
}

或者,您总是可以编写自己的流缓冲区类(http://www.cplusplus.com/reference/streambuf/streambuf/),但我怀疑这会很好,因为整个字符串/流 buf 机制确实意味着正在处理插入/删除的单个字符。

于 2014-05-26T08:08:14.170 回答