В другая тема Я пытался решить эту проблему.Проблема заключалась в удалении повторяющихся символов из std::string
.
std::string s= "saaangeetha";
Поскольку порядок не был важен, поэтому я сначала отсортировал s
, а затем использовал std::unique
и, наконец, изменил его размер, чтобы получить желаемый результат :
aeghnst
Это правильно!
Теперь я хочу сделать то же самое, но в то же время я хочу, чтобы порядок символов не изменился.Значит, я хочу этот вывод:
sangeth
Итак, я написал this :
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 ;
}
, который дает этот вывод:
saangeth
То есть a
повторяется, хотя другие повторения пропали.Что не так с кодом?
В любом случае я немного меняю код : (см. Комментарий)
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 ;
}
Вывод:
sangeth
Проблема исчезла!
Так что же не так с первым решением?
Кроме того, если я не сделаю переменную-член unique
ссылочным типом, тогда проблема не будет.
Что не так с функтором std::set
или is_repeated
?Где именно проблема?
Я также отмечаю, что если функтор is_repeated
куда-то копируется, то каждый его член также копируется.Я не вижу здесь проблемы!