Я пытаюсь разобрать строку с пробелами на несколько строк и сохранить их в списке, который состоит из строк без пробелов. Я не знаю, как долго я буду вводить строку, и у меня есть следующий код:
#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);. Как мне обойти это?
Кроме того, "Ошибка" .. было бы неплохо узнать.
Извините, у меня уже есть решение. Похоже, мне нужно настроить myBuffer на тип string, чтобы push_back соответствовал моему вектору.
@PaulMcKenzie Не могли бы вы дать мне ссылку на то, что делает istringstream? Думаю, ваше решение намного эффективнее. Я не совсем понимаю, что означают std::istringstream strm(mySentence) и strm >> word.
istringstream похож на cin из строки. Вы помещаете в поток то, что хотите проанализировать, а затем считываете это с помощью >>.
@ user4581301 Значит, код std::istringstream strm(mySentence) означает «Вставить содержимое mySentence в эту новую переменную под названием strm»? Под "чтением" (я предполагаю, что это сделано с кодом strm >> word, вы имеете в виду, что я беру строки, разделенные пробелом, и вставляю их в word? Не могли бы вы дать мне краткое прочтение / ссылку по этому вопросу и его реализация, если возможно :-)? Хотелось бы увидеть больше примеров.
Отличный пример - вариант 2 этого ответа на вопрос Построчное чтение файла с помощью ifstream в C++.
@ user4581301 Правильно ли я понимаю вышеупомянутый вопрос (мой предыдущий комментарий)?
Все еще раздумываю над error ...
@TedLyngmo Ошибка говорит: error: no matching function for call to 'std::vector<std::__cxx11::basic_string<char>::push_back(std::vector<char>&)'.
@WealthyPlayer Мои извинения. да.
«Обойти» может быть неправильным подходом. Какова ваша цель в ответных действиях? Опишите, как вы хотите, чтобы программа работала.
@TedLyngmo Я пытаюсь разделить длинное предложение, например «Я - лошадь», содержащееся в переменной типа string, в «я», «я», «а», «лошадь» и вставьте это в vector<string>.





Проблема в том, что вы пытаетесь протолкнуть 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;
}
Что, по вашему отладочному выводу, вы нашли? Я не понимаю того, чего вы не хотите достичь.