В в другой теме я пытался решить проблему this. Проблема заключалась в удалении повторяющихся символов из 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
где-то скопирован, то каждый его член также копируется. Я не вижу здесь проблемы!