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!