Есть ли что-то похожее на split () в C ++, как в Python? - PullRequest
1 голос
/ 20 апреля 2019

Я новичок в конкурентном программировании, и я борюсь с проблемой принятия строки целых чисел, разделенных пробелом, как входных данных в C ++ и сохранения этих целых чисел в векторе.

Изучив ответы на аналогичные вопросы по Stackoverflow, я обнаружил, что предоставленный там код занимает больше времени и места, чем основной код, необходимый для решения программной задачи, и эти фрагменты казались сложными для такой задачи. Поэтому я написал свое собственное решение и попытался распечатать сохраненные элементы вектора, которые на самом деле не работают.

#include <iostream>
#include <vector>
using namespace std;

int main(){

    vector<int> A;
    int tmp;

    while((cin >> tmp) && (!EOF)){
       A.push_back(tmp);
    }

    for(int i : A){
       cout << i << " ";
    } 

    return 0;
}

Я компилирую без ошибок и, кажется, работает как положено. Но как только я закончу с предоставлением последовательности целых чисел, разделенных пробелами, и нажму клавишу ВВОД, программа внезапно завершит выполнение без вывода результата. Пожалуйста, предложите любые исправления, которые я должен внести в мой код. Было бы полезно, если бы вы могли предоставить некоторую информацию о том, имеет ли C ++ что-то похожее на split () в Python. Простой фрагмент кода приветствуется.

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Вы можете использовать std::istream_iterator для чтения целых чисел (или чего-либо еще, для чего у вас есть / define operator>>), разделенных пробелами в некоторый контейнер:

std::vector<int> v;
std::copy(std::istream_iterator<int>{std::cin}, std::istream_iterator{}, std::back_inserter(v));

Если вы хотите читать только из одной строки, то сначала получите эту строку, используя std::getline, оберните заполненный std::string в std::istringstream и используйте вышеуказанное в этом потоке (вместо std::cin)

0 голосов
/ 20 апреля 2019

Вы можете сохранить всю входную строку в строковую переменную, а затем перебирать ее и извлекать подстроку всякий раз, когда встречается пробел или завершается итерация строки.Когда вы получите числовую строку, вы можете преобразовать их в целочисленные значения с помощью функции stoi, прежде чем нажать на вектор A:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main(){

    vector<int> A;
    string input;
    size_t index = 0; // keep track of number first index

    getline(cin, input);

    for (size_t i = 0; i < input.size(); ++i) {
        if (input[i] == ' ') {
            A.push_back(stoi(input.substr(index, i)));
            index = i + 1;
        }
    }
    A.push_back(stoi(input.substr(index, input.size())));


    for(int i : A){
       cout << i << " ";
    } 
    cout << endl;

    return 0;
}
...