C++:从cin流中读取字符串并存储以空格分隔的值

C++:从cin流中读取字符串并存储以空格分隔的值,c++,string,algorithm,stream,cin,C++,String,Algorithm,Stream,Cin,事实上,我想出了一个临时的解决办法,但我仍然认为它可以做得更有效,但如何做呢?我不太熟悉流,还是C++初学者。我的目的是使用std::getline从std::cin流中读取行。我假设它只能作为字符串读取,所以我尝试设置一些std::string::const_迭代器,并使用“”作为分隔符来迭代字符串包含的每个字符,以区分字符串中的不同单词值。我将只读取由单个空格分隔的两个整数 例如: 输入: 2.个案数目 1020 30 40 结果: 在变量A中存储10,在变量B中存储20,在变量C中存储30

事实上,我想出了一个临时的解决办法,但我仍然认为它可以做得更有效,但如何做呢?我不太熟悉流,还是C++初学者。我的目的是使用std::getline从std::cin流中读取行。我假设它只能作为字符串读取,所以我尝试设置一些std::string::const_迭代器,并使用“”作为分隔符来迭代字符串包含的每个字符,以区分字符串中的不同单词值。我将只读取由单个空格分隔的两个整数

例如:

输入:

2.个案数目

1020

30 40

结果:

在变量A中存储10,在变量B中存储20,在变量C中存储30。。。等等

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

int main()
{
    bool next;
    unsigned short int cases;
    long long m, n;
    std::vector<long long> vcases;
    std::string m_n_store;
    std::string m_n_read;
    std::cin >> cases;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    for (int i = 0; i < cases; ++i)
    {
        next = false;
        std::getline(std::cin, m_n_read);
        for (std::string::const_iterator it = m_n_read.begin(); it != m_n_read.end(); ++it)
        {
            if (*it == ' ')
            {
                next = true;
                std::istringstream iss(m_n_store);
                iss >> m;
                vcases.push_back(m);
                m_n_store.erase();
            }
            if (!next) m_n_store.push_back(*it);
            else if (*it != ' ') m_n_store.push_back(*it);
            if (it == (m_n_read.end() - 1))
            {
                std::istringstream iss(m_n_store);
                iss >> n;
                vcases.push_back(n);
                m_n_store.erase();
            };
        }
    }
    for (int i = 0; i < vcases.size(); ++i)
    {
        std::cout << vcases[i] << '\n';
    }
}
试试这个:

size_t pos = 0;
while ((pos = m_n_read.find(" ")) != std::string::npos) {
    std::istringstream iss(m_n_read.substr(0, pos));
    iss >> m;
    vcases.push_back(m);
    m_n_read.erase(0, pos + 1);
} 
if (m_n_read.size() > 0)
{
    std::istringstream iss(m_n_read);
    iss >> m;
    vcases.push_back(m);
}

默认情况下,C++流用空格分隔输入操作。不需要遍历字符串并用空格字符将其打断。您可以使用std::istream_迭代器和向量的范围构造函数:

std::vector mcase{std::istream_迭代器{std::cin},{};