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