Ошибка в получении алфавита для заданного сообщения
Пояснение:Под алфавитом я подразумеваю первое вхождение символов в сообщение и эти символы идут в том порядке в каком они представлены в сообщении.К примеру, есть на входе сообщение:"шла саша по шоссе и сосала сушку." На выходе:"шлас поеиук."
Вопрос:у меня результат "шл спосеиук".Почему у меня удаляются все буквы "a" и как оставить только одну букву "c" в слове "cпосеиук"?
string str;
char temp;
cout << "Введите предложение: ";
getline(cin, str);
for (int i = 0; i < str.length(); i++) {
temp = str[i];
for (int j = 0; j < str.length(); j++) {
if (str[j] == temp && i != j)
str.erase(j, 1);
}
}
cout << "Алфавит сообщения: " << str;
Ответы (2 шт):
Потому что erase инвалидирует все итераторы в точке удаления и за ней. А у вас j вполне может быть меньше i.
Я бы рекомендовал собирать символы в другой вектор, это проще. Если собирать в том же - то хотя бы начинайте проверку c j = i+1...
getline(cin, str);
for (int i = 0; i < str.length(); i++) {
temp = str[i];
for (int j = i+1; j < str.length(); j++) {
if (str[j] == temp && i != j)
str.erase(j, 1);
}
}
Начните с конца, проверяйте только нужную часть строки.
for (int i = str.length() - 1; i > 0; i++) {
temp = str[i];
for (int j = 0; j < i; j++) {
if (str[j] == temp)
str.erase(i, 1);
break;
}
}