Ошибка в получении алфавита для заданного сообщения

Пояснение:Под алфавитом я подразумеваю первое вхождение символов в сообщение и эти символы идут в том порядке в каком они представлены в сообщении.К примеру, есть на входе сообщение:"шла саша по шоссе и сосала сушку." На выходе:"шлас поеиук."

Вопрос:у меня результат "шл спосеиук".Почему у меня удаляются все буквы "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 шт):

Автор решения: Harry

Потому что 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);
    }
}
→ Ссылка
Автор решения: MBo

Начните с конца, проверяйте только нужную часть строки.

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; 
    }
}
→ Ссылка