Для чего-то, что я пробовал в C ++, я принял строку (скажем, «помидор красный») и избавился от пробелов («atomatoisred»).
Теперь, как бы мне удалить только повторяющиеся символы при условии, что первый экземпляр этого символа останется (так что наш пример становится «атомизированным»)?
Заранее спасибо!
Вы можете использовать стереть-удалить идиому в сочетании с набором отслеживания дубликатов символов:
std::set<char> dupes;
str.erase(
std::remove_if(
str.begin(), str.end(),
[&](char c) { return not dupes.insert(c).second; }),
str.end());
Это также использует тот факт, что возвращаемое значение std::set::insert
это пара, чей второй элемент является bool
указывает, была ли вставка.
Если вы хотите реализовать это самостоятельно (без stl
) Есть несколько способов.
Через сортировку. Это работает, если вы не заботитесь о порядке символов. Сначала отсортируйте строку, затем просмотрите ее, выполнив очень простую проверку каждого элемента:
if( currentElement == elemebtBeforeIt )
deleteCurrentElement
Другим способом является создание массива, выделенного для уникальных символов (ну, может быть, не массив, но вы поймете идею). Просмотрите вашу строку и для каждого символа проверьте:
foreach Element of the string:
if( arrayOfUniqueElements contains currentElement )
do nothing
else
put currentElement into the arrayOfUniquElements
После этого у вас будут все уникальные элементы в выделенном массиве.