преобразование stringstream в stl-контейнеры - PullRequest
0 голосов
/ 29 июня 2018

Я хочу преобразовать поток строк в вектор, но я потерял все свои пробелы во время него.

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

Также мой метод разговора не выглядит элегантно. Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 29 июня 2018

Как отмечено в комментариях Некоторые программисты чувак , operator>> пропускают пробелы по умолчанию.

Можно напрямую построить std::vector<char> из std::stringstream, используя соответствующую перегрузку и пару std::istreambuf_iterator с:

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