2013-12-17 2 views
0

У меня есть строка, содержащая следующее:Удаление повторяющихся строк хранится в строке

This is a line. 
This is another line. 
This is yet another line. 
This is a line. 
[...] 

Как удалить повторяющиеся строки из строки?

+0

У вас есть только строка, содержащая весь текст или несколько строк? – Raxvan

ответ

3

Проигрывать std::set<std::string>. Добавьте к ней каждую строку (set будет неявно передавать дубликаты).

Вытяните значения обратно с помощью std::set<std::string>::const_iterator.

Обратите внимание, что линии вернутся в лексикографическом порядке. Если вы этого не хотите и имеете C++ 11, используйте вместо этого std::unordered_set<std::string> (признайте @ Ивайло Странджева).

1

Вы можете преобразовать строку в вектор строк и использовать этот фрагмент кода для удаления дубликатов.

void removeDuplicate(std::vector<std::string>& vec) 
{ 
    std::sort(vec.begin(), vec.end()); 
    vec.erase(std::unique(vec.begin(), vec.end()), vec.end()); 
} 
+0

Пожалуйста, подумайте над тем, чтобы ваш ответ был самодостаточным. Комментарии, как правило, исчезают. – Bathsheba

+0

Возможно, вы захотите привести 'std :: stable_sort', чтобы сохранить исходный порядок, в котором эти строки появились в исходной строке. –

5

В строке нет понятия линии. Вам придется разделить линии по своему усмотрению. Одним из возможных решений является построение stringstream из строки и использование на нем getline.

Вы можете разобрать строки в std::set<string> или лучше std::unordered_set<string> (если c++11 вариант), и вы будете автоматически иметь только один экземпляр каждой строки, хранящейся в наборе. Недостатком этого решения является то, что он не сохранит первоначальный порядок строк. Если вам нужно сохранить его, используйте хелпер-набор и нажмите строки в std::vector, где вы поместите их в первоначальном порядке.

+0

Зачем было лучше? Std :: unordered_set'? –

+0

@ MatthieuM. это асимптотически быстрее - вставка в 'std :: set' имеет сложность' O (log (N)) ', в то время как вставка в' std :: unordered_set' имеет амортизированную сложность 'O (1)' (Фактически для строк разница будет еще больше, так как для каждого сравнения будет порядок длины строки, а с неупорядоченным - только мы будем сравнивать хэши). –

+0

* это асимптотически быстрее *: с хорошей хеш-функцией (остерегайтесь столкновений), к сожалению, мы не знаем, является ли хэш-функция хорошей, и достаточно ли размер задачи ОП для входа в эту асимптотическую область. * амортизированная сложность *: не совсем, по крайней мере, не с вырожденными входами/хэш-функциями. * в то время как с 'unordered_set' мы сравниваем хэши *: это зависит от реализации, хэши кешей Boost, но Dirkumware не так, что они обрабатывают сравнение в-bucket по-разному; кроме того, в случае столкновения хэшей он прибегает к сравне нию равенства. * Нет серебряной пули. * –

Смежные вопросы