Это может быть очень простой вопрос, но, просматривая ссылку на 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
но только эти три числа.
Есть идеи, что можно использовать для этого?
Буфер, содержащий последовательность целых чисел 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
и инт 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;
С этой семантикой (вставка потока): нет, нет.
Из вашего примера похоже, что вы хотите заполнить вектор целых чисел.
Вам понадобится функтор (манипулятор 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;
}
В качестве альтернативы, вы всегда можете написать свой собственный класс streambuffer (http://www.cplusplus.com/reference/streambuf/streambuf/) но я сомневаюсь, что это пойдет очень хорошо, потому что весь механизм buf-строки / потока действительно предназначен для работы с отдельными символами, которые вставляются / удаляются.