O que há de errado com `std :: set`?

Emo outro tópico Eu estava tentando resolverist problema. O problema foi remover caracteres duplicados de umstd::string.

std::string s= "saaangeetha";

Como o pedido não era importante, classifiqueis primeiro e depois usadostd::unique e finalmente o redimensionou para obtero resultado desejado:

aeghnst

Está correto

Agora quero fazer o mesmo, mas ao mesmo tempo quero a ordem dos caracteres intactos. Significa, eu quero esta saída:

sangeth

Então eu escreviist:

template<typename T>
struct is_repeated
{
    std::set<T>  unique;
    bool operator()(T c) { return !unique.insert(c).second; }
}; 
int main() {
    std::string s= "saaangeetha";
    s.erase(std::remove_if(s.begin(), s.end(), is_repeated<char>()), s.end()); 
    std::cout << s ;
}

Que fornece esta saída:

saangeth

Isso é,a é repetido, embora outras repetições tenham desaparecido. O que há de errado com o código?

De qualquer maneira, eualterar meu código um pouco: (veja o comentário)

template<typename T>
struct is_repeated
{
    std::set<T> & unique;  //made reference!
    is_repeated(std::set<T> &s) : unique(s) {} //added line!
    bool operator()(T c) { return !unique.insert(c).second; }
}; 
int main() {
    std::string s= "saaangeetha";
    std::set<char> set; //added line!
    s.erase(std::remove_if(s.begin(),s.end(),is_repeated<char>(set)),s.end()); 
    std::cout << s ;
}

Saída

sangeth

Problem ido!

Então, o que há de errado com a primeira solução?

Also, se eu não fizer a variável membrounique tipo de referência, entãoo problema não vai.

O que há de errado comstd::set ouis_repeated functor? Onde exatamente está o problema?

Observe também que, se ois_repeated functor é copiado em algum lugar, então todos os membros também são copiados. Não vejo o problema aqui!

questionAnswers(7)

yourAnswerToTheQuestion