Я пытаюсь создать программу, которая фильтрует речевой текст, удаляет все нежелательные символы («,», «?» И т. Д. »), А затем создает новую речь, в которой слова перемешиваются на основекакие слова следуют или предшествуют им. Так, например, если у вас был адрес Геттисберга:
Четыре десятка и семь лет назад наши отцы породили на этом континенте новую нацию, зачатую в Свободе,и посвященный утверждению, что все люди созданы равными.
моя программа взяла бы этот текст, поместил бы его в набор строк, т.е. ["Four","score","and","seven",...."continent,"..."Liberty,"..."equal."]
Затем он удалил бы любые нежелательные символы из каждой строкииспользуя c ++ .erase и c ++ .remove, например "," или "." и прописные буквы. После этого у вас будет отфильтрованная строка, такая как ["four","score","and","seven",...."continent"..."liberty"..."equal."]
После этого слова будут преобразованы в новыйсвязная, смешная речь, такая как: «Семь лет назад наши отцы задумались над мужчинами ...» и т. д.
Это было просто для того, чтобы вы знали масштабы этого проекта. Моя проблема на данный момент должналибо с использованием моего итератора правильно, либо с нулевыми терминаторами.
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <set>
#include <iterator> //iterates through sets
#include <algorithm>
using namespace std;
int main() {
set <string> speechSet;
set <string> ::iterator itr; //forgot what :: means. Declares iterator as set
int sum = 0;
int x;
string data;
ofstream out;
string setString;
ifstream speechFile; //declare output file stream object. Unknown type name
speechFile.open("./MySpeech");
if (!speechFile) {
cerr << "Unable to open file " << endl;
exit(1);
}
char unwantedCharacters[] = ".";
while (!speechFile.eof()) {
speechFile >> data; //speechFile input into data
for (unsigned int i = 0; i < strlen(unwantedCharacters); ++i) {
data.erase((remove(data.begin(), data.end(),
unwantedCharacters[i]), data.end())); //remove doesn't delete.
data.end() - 1 = '\0'; //Reorganizes
cout << data << endl;
}
speechSet.insert(string(data));
}
//Go through each string (word) one at a time and remove "",?, etc.
/*for(itr = speechSet.begin(); itr != speechSet.end(); ++itr){
if(*itr == ".")//if value pointed to by *itr is equal to '.'
itr = speechSet.erase(itr);//erase the value in the set and leave blank
cout << " " << *itr;//print out the blank
else{
cout << " " << *itr;
}
}*/
speechFile.close();
return (0);
}
Я получаю сообщение об ошибке error: no viable overloaded '='
.Сначала я подумал, что это может быть связано с тем, что .end () не является командой для строки C ++, но я проверил документацию, и это не должно быть проблемой несоответствующих типизированных данных.Тогда я подумал, что, возможно, придется установить значение итератора itr равным концу данных.
iterator itr = data.end() - 1;
, а затем разыменовать этот указатель и установить его равным нулевому терминатору
itr* = '\0';
Это устранило ошибку перегрузки, но у меня все еще была другая ошибка use of class template 'iterator' requires template arguments
.Дайте мне знать, если понадобятся дополнительные разъяснения.