Я пытаюсь прочитать несколько целых чисел из одной входной строки в массив например. Ввод: 100 200 300 400, поэтому массив равен: a [0] = 100, a [1] = 200, a [2] = 300, a [3] = 400 Вещь в том, что число целых чисел неизвестно , поэтому размер массива неизвестен.Чтение списка целых чисел в одной строке ввода в C++
ответ
Вы должны использовать контейнер, который автоматически изменяет размеры, например std::vector
.
Например, что-то вроде этого:
#include <string>
#include <iostream>
#include <sstream>
#include <utility>
#include <iterator>
std::string line;
getline(instream, line);
std::istringstream this_line(line);
std::istream_iterator<int> begin(this_line), end;
std::vector<int> values(begin, end);
О, действительно, еще лучше :-) –
Я думаю, вы хотели использовать 'std :: istream_iterator
@ DietmarKühl: Спасибо, что вы указали неправильное имя. Это правильный способ избежать наиболее неприятного разбора? –
Вы можете использовать std::vector
для этого:
std::vector<int> myVector;
std::string line;
std::getline(std::cin, line);
std::istringstream os(line);
int i;
while(os >> i)
myVector.push_back(i);
Этот код необходимо следующее включает: <iostream>
, <string>
, <sstream>
и <vector>
.
Остановите 'злоупотребление namepsace std;'. Это действительно очень грязная привычка, и она разрушает умы всех тех новичков ... –
@KerrekSB: Я попробую. – LihO
Я не думаю, что это так плохо, как это делает Керрек, но пример кода должен быть еще более нетронутым, чем производственный код. –
Inserters и поток итераторы могут сделать это красиво:
#include <iterator>
#include <vector>
#include <iostream>
#include <algorithm>
std::vector<int> numbers;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(numbers));
Или, как @Ben Фойгт имеет его, построить вектор от входа в один идти (если это опция):
std::vector numbers(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>());
Вы можете заменить std::cin
б y подходящий поток строк, если ваши требования к вводу более сложны.
Boo to 'std :: copy',' std :: vector' знает, как построить себя из диапазона. –
Это игнорирует требование «одной строки». –
@BenVoigt: Да да да ... –
Что вы попробовали? –