на «для передачи ссылок на шаблоны функций (алгоритмы), которые обычно принимают копии своих аргументов», например так:
гая тема Я пытался решитьэто проблема. Проблема заключалась в удалении повторяющихся символов изТак как порядок был не важен, поэтому я отсортировалstd::string
.
std::string s= "saaangeetha";
сначала, а потом использовалs
и, наконец, изменил размер, чтобы получитьstd::unique
желаемый результатЭто верно!:
aeghnst
Теперь я хочу сделать то же самое, но в то же время я хочу, чтобы порядок символов не изменился. Значит, я хочу этот вывод:
Так я написала
sangeth
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
Кроме того, сортировка данных O (N log N). Существует гораздо более эффективный алгоритм для этого. Сделайте линейный проход строки, считая вхождения каждого символа. Сделайте второй проход строки и выведите ее, только если счетчик равен 1. Это O (N).