实际上我想出了(临时)解决方案,但我仍然认为它可以做得更有效,但如何?我不是很熟悉流(还是c++初学者)。我的观点是使用std::getline()
从std::cin
流读取行(我假设它只能作为字符串读取),所以我试图设置一些std::string::const_iterator
并迭代我的字符串包含的每个字符,使用' '
作为分隔符来区分我的字符串中的不同单词(值)。我将只读取两个用一个空格分隔的整数。
的例子:
输入:结果:2(例数)
10 20 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';
}
}
c++流,默认情况下,用空格分隔输入操作。不需要遍历字符串并用空格字符分隔它。您可以使用std::istream_iterator
和vector的范围构造函数:
std::vector<long long> mcases{std::istream_iterator<long long>{std::cin}, {}};
试试这个:
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);
}