#c #string #list #integer
#c #строка #Список #целое
Вопрос:
Если бы у меня был список целых чисел, разделенных пробелом в одной строке (например: 50 34 1 3423 5 345), то каким был бы наилучший способ сделать каждое из них отдельной целочисленной переменной — собрать список целых чисел с помощью cin
?
Ответ №1:
#include <iostream>
#include <vector>
#include <iterator>
std::vector<int> ints;
std::copy(std::istream_iterator<int>(cin),
std::istream_iterator<int>(),
std::back_inserter(ints));
Выполнено. Если вам действительно нужно явно читать по строкам:
#include <sstream>
#include <iostream>
#include <vector>
#include <iterator>
std::string singleline;
std::istringstream iss; // out of loop for performance
while (std::getline(cin, singleline))
{
iss.str(singleline);
std::copy(std::istream_iterator<int>(iss),
std::istream_iterator<int>(),
std::back_inserter(ints));
}
istream_iterator<int>
Будет повторно применяться operator>>(intamp;)
к потоку, на который ссылается поток (до конца потока). По умолчанию это автоматически игнорирует пробелы и выдает исключение, если операция ввода завершилась неудачно (например, обнаружен нецелочисленный ввод)
back_inserter — это итератор вывода, который вы можете использовать со всеми типами контейнеров (например, vector
), которые поддерживают .push_back
операцию. Итак, на самом деле то, что написано там на алгоритмическом языке STL, похоже на
std::vector<int> ints;
while (iss>>myint)
{
ints.push_back(myint);
}
Комментарии:
1. Спасибо — потрудитесь объяснить, что … что-нибудь из этого делает?
2. @sehe — Вам не кажется, что этот ответ слишком прост для OP?
3. @Pete Я не согласен. Это именно тот тип кода, который следует использовать новичкам. Чем меньше собственного кода напишет новичок, тем лучше.
4. @Pete: я обычно публикую основную часть ответа, а затем трачу некоторое время на приукрашивание, часто в зависимости от отзывов OP
5. @sehe: Я думаю.. вы имели в виду
std::istream_iterator<int>(iss)
.. вместоstd::istream_iterator<iss>(cin)
.
Ответ №2:
В продолжение ответа sehe вот как вы могли бы сделать это немного более подробно (кхм).
Алгоритмы, которые он использовал, в основном, делают это внутренне. Этот ответ включен в основном для наглядности.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> myInts;
int tmp;
while (std::cin >> tmp) {
myInts.push_back(tmp);
}
// Now `myInts` is a vector containing all the integers
}
Комментарии:
1. 1 Хехе. Спасибо, что продолжили мою работу по объяснению неудобного STL-ese 🙂 Полагаю, на практике я бы действительно посоветовал это. Хотя, да, я предпочитаю вариант алгоритма выполнения действий по слегка пуристским причинам.
2. Я не понимаю — как это работает, если я ввожу все целые числа в одной строке?
3. @PigHead: Строки не имеют значения.
>>
считывает столько символов, сколько может, пока они допустимы дляint
, затем останавливается. Он также имеет тенденцию игнорировать пробелы, поэтому он будет немедленно готов к извлечению следующей подстроки, имеющей числовой вид.4. Это единственное, что мне действительно нужно было знать! Спасибо
5. @PigHead: Нет проблем. iostreams — это немного мусор. Удачи!
Ответ №3:
Взгляните на справочные страницы для strtok( )
и atoi( )
Комментарии:
1. Фу. Сейчас 21 век, приятель.
2. @Tomalak Geret’kal — Клянусь Богом, я сохраняю свои инвестиции в buggy whips!