实际上我提出了(临时)解决方案,但我仍然认为它可以提高效率,但是如何?我不太熟悉流(仍然是C ++初学者)。我的观点是使用std::cin
从std::getline()
流读取行(我假设它只能作为字符串读取)所以我尝试设置一些std::string::const_iterator
并迭代我的字符串包含的每个char使用' '
作为分隔符来区分字符串中的不同单词(值)。我将只读取由单个空格分隔的两个整数。
示例:
输入:
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';
}
}
答案 0 :(得分:0)
试试这个:
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);
}
答案 1 :(得分:0)
默认情况下,C ++流以空格分隔输入操作。没有必要迭代一个字符串并用空格字符来打破它。您可以使用std::istream_iterator
和向量的范围构造函数:
std::vector<long long> mcases{std::istream_iterator<long long>{std::cin}, {}};