Push_back все содержимое в vector <char>, чтобы объединить их как первый элемент vector <string>

Я пытаюсь разобрать строку с пробелами на несколько строк и сохранить их в списке, который состоит из строк без пробелов. Я не знаю, как долго я буду вводить строку, и у меня есть следующий код:

#include <bits/stdc++.h>
#include <sstream>

using namespace std;

vector<string> myWords;
vector<char> myBuffer;

int main() {
    string mySentence;
    getline(cin, mySentence);

    int j = 0;
    for (int i = 0; i < mySentence.length(); i++) {
        if (mySentence[i] != ' ') myBuffer.push_back(mySentence[i]);
        else {
            myWords.push_back(myBuffer);
            myBuffer.clear();
            j++;
        }
    }

    return 0;
}

Ошибка, которую я получаю, находится на myWords.push_back(myBuffer);. Как мне обойти это?

Что, по вашему отладочному выводу, вы нашли? Я не понимаю того, чего вы не хотите достичь.

Ted Lyngmo 17.11.2018 05:52

Кроме того, "Ошибка" .. было бы неплохо узнать.

Ted Lyngmo 17.11.2018 06:00
#include <bits/stdc++.h> - Не делай этого
PaulMcKenzie 17.11.2018 06:03
Я пытаюсь разобрать строку с пробелами на несколько строк и сохранить их в списке - это намного проще, если вы использовали std :: istringstream
PaulMcKenzie 17.11.2018 06:05

Извините, у меня уже есть решение. Похоже, мне нужно настроить myBuffer на тип string, чтобы push_back соответствовал моему вектору.

Richard 17.11.2018 06:11

@PaulMcKenzie Не могли бы вы дать мне ссылку на то, что делает istringstream? Думаю, ваше решение намного эффективнее. Я не совсем понимаю, что означают std::istringstream strm(mySentence) и strm >> word.

Richard 17.11.2018 06:15
istringstream похож на cin из строки. Вы помещаете в поток то, что хотите проанализировать, а затем считываете это с помощью >>.
user4581301 17.11.2018 06:22

@ user4581301 Значит, код std::istringstream strm(mySentence) означает «Вставить содержимое mySentence в эту новую переменную под названием strm»? Под "чтением" (я предполагаю, что это сделано с кодом strm >> word, вы имеете в виду, что я беру строки, разделенные пробелом, и вставляю их в word? Не могли бы вы дать мне краткое прочтение / ссылку по этому вопросу и его реализация, если возможно :-)? Хотелось бы увидеть больше примеров.

Richard 17.11.2018 06:26

Отличный пример - вариант 2 этого ответа на вопрос Построчное чтение файла с помощью ifstream в C++.

user4581301 17.11.2018 06:28

@ user4581301 Правильно ли я понимаю вышеупомянутый вопрос (мой предыдущий комментарий)?

Richard 17.11.2018 06:32

Все еще раздумываю над error ...

Ted Lyngmo 17.11.2018 06:48

@TedLyngmo Ошибка говорит: error: no matching function for call to 'std::vector<std::__cxx11::basic_string<char>::push_back(std‌​::vector<char>&)'.

Richard 17.11.2018 06:50

@WealthyPlayer Мои извинения. да.

user4581301 17.11.2018 07:19

«Обойти» может быть неправильным подходом. Какова ваша цель в ответных действиях? Опишите, как вы хотите, чтобы программа работала.

Ted Lyngmo 17.11.2018 07:41

@TedLyngmo Я пытаюсь разделить длинное предложение, например «Я - лошадь», содержащееся в переменной типа string, в «я», «я», «а», «лошадь» и вставьте это в vector<string>.

Richard 17.11.2018 08:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
15
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы пытаетесь протолкнуть std::vector<char> туда, где ожидается std::string. Так что просто измените тип myBuffer на std::string:

#include <iostream>
#include <string>

int main() {
    std::string mySentence;
    std::getline(std::cin, mySentence);

    std::vector<std::string> myWords;
    std::string myBuffer;

    for (int i = 0; i < mySentence.length(); i++) {
        if (mySentence[i] != ' ')
            myBuffer.push_back(mySentence[i]);
        else {
            myWords.push_back(myBuffer);
            myBuffer.clear();
        }
    }

    if (!myBuffer.empty()) {
        myWords.push_back(myBuffer);
    }

    // use myWords as needed...

    return 0;
}

При этом использование std::istringstream было бы намного проще, поскольку operator>> считывает значения, разделенные пробелами, из потока за вас:

#include <iostream>
#include <string>
#include <sstream>

int main() {
    std::string mySentence;
    std::getline(std::cin, mySentence);

    std::vector<std::string> myWords;
    std::string myBuffer;

    std::istringstream iss(mySentence);
    while (iss >> myBuffer) {
        myWords.push_back(myBuffer);
    }

    // use myWords as needed...

    return 0;
}

В качестве альтернативы, позвольте стандартной библиотеке обрабатывать чтение и продвижение за вас:

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

int main() {
    std::string mySentence;
    std::getline(std::cin, mySentence);

    std::vector<std::string> myWords;

    std::istringstream iss(mySentence);
    std::copy(
        std::istream_iterator<std::string>(iss),
        std::istream_iterator<std::string>(),
        std::back_inserter(myWords)
    );

    // use myWords as needed...

    return 0;
}

Другие вопросы по теме