Список случайных целых чисел

#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!