чтение ввода переменной длины в C ++ с использованием потока - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть следующее требование, которое должно быть прочитано в программе.

Первая строка содержит два целых числа через пробел, обозначающих соответствующие значения p (число массивов переменной длины) и q (числоколичество запросов). Каждая строка последующих строк содержит разделенную пробелами последовательность для каждого элемента массива.

Каждая из последующих строк содержит два разделенных пробелом целых числа, описывающих соответствующие значения i (индекса в массиве) и j(индекс в массиве, на который ссылается) для запроса.

2 2
3 1 5 4
5 1 2 8 9 3
0 1
1 3

В приведенном выше примере у меня есть 2 массива и 2 запроса. Первый массив 3,3,5, 4 и второй массив 5 1 2 8 9 3.

У меня вопрос, как я могу прочитать эти данные в моем контейнере. Примечание: я не могу ввести ввод с консоли, здесь некоторые тестовые программы обеспечивают ввод.

Я написал, как показано ниже

int iNoOfVectors = 0;
    int iNoOfQueries = 0;
    cin >> iNoOfVectors >> iNoOfQueries;
    cout << iNoOfVectors ; 
    vector<vector<int>> container;
    container.reserve(iNoOfVectors);
    for(int i = 0; i < iNoOfVectors; i++ ) {
        int temp;
        std::string line;
        while (std::getline(std::cin, line))
        {
            std::cout << line << std::endl;
        }
    }

вывод выше

2
3 1 5 4
5 1 2 8 9 3
0 1
1 3

Как можноЯ получаю элементы массива переменной длины в свой контейнер.

Спасибо

1 Ответ

2 голосов
/ 03 ноября 2019

Если вы хотите прочитать похожие данные из строки в вектор, вам нужно выполнить следующие 2 шага:

  • Поместить содержимое строки в std::istringstream
  • Перебор элементов в потоке istringstream с std::istream_iterator

Пример:

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <vector>

int main() {

    // The source string
    std::string stringWithIntegers{ "5 1 2 8 9 3" };

    // Build an istringstream with the above string as data source
    std::istringstream iss{ stringWithIntegers };

    // Define variable 'data'. Use range constructor and stream iterator    
    std::vector<int> data{std::istream_iterator<int>(iss), std::istream_iterator<int>()};

    // Display result
    std::copy(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, "\n"));

    return 0;
}

Возможно также копирование данных:

    std::vector<int> data{};

    std::copy(
        std::istream_iterator<int>(iss),
        std::istream_iterator<int>(),
        std::back_inserter(data)
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...