如何在字符串流中获取整数并将它们添加到数组中?

时间:2015-03-25 23:05:26

标签: c++ string stringstream

我不想要第一个,我想要它们。我怎样才能做到这一点?我总是得到任何东西或只有第一个值,我已经将stringstream转换为字符串。有没有办法直接从stringstream获取它?整数由分号分隔。

2 个答案:

答案 0 :(得分:1)

您可以使用std::vector,如果您知道之前的整数数量,则可以使用reserve来提高效果。由于您使用分号作为分隔符,因此一种解决方案是将此分隔符与std::getline一起使用:

#include <iostream>
#include <sstream>
#include <vector>
#include <string>

int main()
{
    std::stringstream ss{"1;2;3;4;5;6;7;8;9;10"};
    std::vector<int> ints;

    // Reserve space for 10 integers:
    ints.reserve(10);

    std::string temp;
    while (std::getline(ss, temp, ';'))
        ints.push_back(std::stoi(temp));

    for (int i : ints)
        std::cout << i << ' ';

    return 0;
}

答案 1 :(得分:0)

仅仅是使用复制和迭代器。

template<std::size_t SIZE>
void func(std::istream& stream, std::array<int, SIZE>& arr)
{
    std::copy_n(std::istream_iterator<int>(stream), SIZE, std::begin(arr));
}

但是考虑到数组,你应该考虑使用迭代器。这样你就可以使用任何容器类型。

template<typename I>
void func(std::istream& stream, I dst)
{
    std::copy(std::istream_iterator<int>(stream),
              std::istream_iterator<int>(),
              dst);
}

你还在评论中提到了矢量:

void func(std::istream& stream, std::vector<int>& vec)
{
    std::copy(std::istream_iterator<int>(stream),
              std::istream_iterator<int>(),
              std::back_inserter(vector)
             );
}

现在你提到你的号码是逗号分隔的。为了解决这个问题,您可以定义一个读取数字和尾随逗号的类;

struct NumberAndComma
{
    int   number;
    operator int() {return number;}
    friend std::istream& operator>>(std::istream& str, NumberAndComma& data)
    {
        if (str >> number) {
            char x;
            stream >> x;
            if (x != ',') {
                stream.unget();
            }
            if (!stream) {
                // It was good before we tried to read comma.
                // so really it should still be good even if there is no comma
                stream.clear();
            }
        }
        return stream;
    }
};

现在你可以使用以上的int inplace:

void func(std::istream& stream, std::vector<int>& vec)
{
    std::copy(std::istream_iterator<NumberAndComma>(stream),
              std::istream_iterator<NumberAndComma>(),
              std::back_inserter(vector)
             );
}