Вопрос

Для небольшого эксперимента на 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), есть несколько способов.

  1. Через сортировку.Это работает, если вас не волнует порядок символов.Сначала отсортируйте строку, а затем просмотрите ее, выполняя очень простую проверку каждого элемента:

    if( currentElement == elemebtBeforeIt )
        deleteCurrentElement
    
  2. Другой способ — создать массив, посвященный уникальным символам (ну, может, и не массив, но вы поймете).Просмотрите свою строку и для каждого символа проверьте:

    foreach Element of the string:
        if( arrayOfUniqueElements contains currentElement ) 
            do nothing
        else
            put currentElement into the arrayOfUniquElements
    

    После этого все уникальные элементы появятся в выделенном массиве.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top