Разбор строки случайной последовательности символов и целых в отдельные векторы - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу иметь возможность анализировать строку, такую ​​как:

inputStr = "abc 12 aa 4 34 2 3 40 3 4 2 cda t 4 car 3"

В отдельные векторы (вектор строки и вектор целых чисел), такие что:

strVec = {"abc", "aa", "cda", "t", "car"};
intVec = {12, 4, 34, 2, 3, 40, 3, 4, 2, 4, 3};

Что такоехороший способ сделать это?Я немного знаком с stringstream и мне было интересно, возможно ли сделать что-то вроде этого:

std::string str;
int integer;
std::vector<int> intVec;
std::vector<std::string> strVec;
std::istringstream iss(inputStr);

while (!iss.eof()) {
    if (iss >> integer) {
        intVec.push_back(integer);
    } else if (iss >> str) {
        strVec.push_back(str);
    }
}

Я пытался что-то сделать с этой целью, но программа, похоже, останавливается вроде (?).Любой совет очень ценится!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

При сбое iss >> integer поток прерывается, и iss >> str будет продолжать сбой.Решение состоит в том, чтобы использовать iss.clear(), когда iss >> integer не удается:

if (iss >> integer) {
    intVec.push_back(integer);
} else {
    iss.clear();
    if (iss >> str) strVec.push_back(str);
}
0 голосов
/ 26 апреля 2018

Я думаю, что этот ответ является лучшим здесь.

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

template<typename Out>
void split(const std::string &s, char delim, Out result) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        *(result++) = item;
    }
}

std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, std::back_inserter(elems));
    return elems;
}

Первоначально ответили здесь , затем вы можете попытаться различить строки и числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...