Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
9 / 9 / 1
Регистрация: 28.03.2013
Сообщений: 82
1

Удаление похожих строк в списке

02.11.2013, 01:45. Показов 782. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть STL список (list).
В нем находятся теги типа <html>, <st>, <HTML>, </Html>.
Теги типа <html> и </Html> считаются одинаковыми. Нужно удалить одинаковые в списке.
Как их удалить в списке? Я не знаю как описать булевский предикат для функции unique.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <fstream>
#include <list>
#include <string>
using namespace std;
 
bool EqualDash (string & str1, string & str2) { // Эта часть не правильно работает
    return str1.erase(1,1) == str2;
}
 
int main() {
 
    ifstream fileReader;
    fileReader.open("input.txt");
 
    list<string> tegs;
 
    while (!fileReader.eof()) { // тут список заполняется тегами из файла, тут все правильно, можно не обращать внимания
        string str, teg;
        getline(fileReader,str);
        int t1 = 0, t2 = 0;
        bool first = true;
        do {
            t1 = t2;
            if (first)
                t1 = str.find('<', t1);
            else 
                t1 = str.find('<', t1 + 1);
            t2 = str.find('>', t1 + 1);
            if ((t2 - t1) > 1 && t1 >= 0 && t2 >= 0 &&
                ((str[t1 + 1] >= 'A' && str[t1 + 1] <= 'z') || (str[t1 + 1] == '/'))) {
                teg.assign(str,t1,(t2 - t1) + 1);
                tegs.push_back(teg);
            }
        } while (t1 >= 0 && t2 >= 0);
    }
 
    tegs.unique(EqualDash); // Здесь нужно в параметр функции засунуть булевскую функцию или предикат, я не знаю как его сделать что бы <html> и </Html> считались одинаковыми и удалялся один из них
    for (list<string>::iterator it = tegs.begin(); it != tegs.end(); it ++)
        cout << *it << endl;
 
    system("pause");
    return 0;
}
То есть нужно опустить символы тегов в нижний регистр, а так же удалить символ / у тех тегов, которые повторяются. Как этого сделать я не пойму, используя список.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2013, 01:45
Ответы с готовыми решениями:

Удаление похожих строк
Доброго дня.Появилось проблема, но тем похожих много на форуме. Может кто подскажет конкретно в...

Notepad++ удаление похожих строк
Здравствуйте, уважаемые знатоки. Имеется следующая необходимость из списка вида...

Удаление строк, отсутствующих в списке из другого файла (доработка кода)
Здравствуйте. Помогите доработать/подправить код. Задача: В файле 01.txt необходимо удалить все...

Объединение похожих строк
Здравствуйте. Необходимо объединить похожие строки в таблице. Вот например: declare @table1...

7
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
02.11.2013, 02:07 2
Если их в список не добавлять, то и незачем будет удалять
0
9 / 9 / 1
Регистрация: 28.03.2013
Сообщений: 82
02.11.2013, 02:08  [ТС] 3
Дело в том, что нужно удалять именно после того, как все они будут добавлены.
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
02.11.2013, 02:12 4
Что бы выполнилось удаление необходимо чтобы одинаковые элементы были расположены друг за другом т.е 1223 будет выполнено удаление, а 1232 не будет

Добавлено через 3 минуты
и вообще лучше при добавлении новой проверять нет ли уже в списке похожей строки
1
9 / 9 / 1
Регистрация: 28.03.2013
Сообщений: 82
02.11.2013, 02:17  [ТС] 5
Спасибо за подсказку о сортировке, это мне помогло.
В общем сделал функцию методом подбора, вроде заработало.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <fstream>
#include <list>
#include <string>
using namespace std;
 
 
 
bool EqualDash (string & str1, string & str2) {
    if (str1[1] == '/')
        return str1.erase(1,1) == str2;
    else 
        return str1 == str2;
}
 
int main() {
 
    ifstream fileReader;
    fileReader.open("input.txt");
 
    /*ofstream fileWriter;
    fileWriter.open("output.txt");*/
 
    list<string> tegs;
    
    while (!fileReader.eof()) {
        string str, teg;
        getline(fileReader,str);
        int t1 = 0, t2 = 0;
        bool first = true;
        do {
            t1 = t2;
            if (first)
                t1 = str.find('<', t1);
            else 
                t1 = str.find('<', t1 + 1);
            t2 = str.find('>', t1 + 1);
            if ((t2 - t1) > 1 && t1 >= 0 && t2 >= 0 &&
                ((str[t1 + 1] >= 'A' && str[t1 + 1] <= 'z') || 
                ((str[t1 + 1] == '/') && (str[t1 + 2] >= 'A' && str[t1 + 2] <= 'z')))) {
                teg.assign(str,t1,(t2 - t1) + 1);
                tegs.push_back(teg);
            }
        } while (t1 >= 0 && t2 >= 0);
    }
    tegs.sort();
    tegs.unique(EqualDash);
    for (list<string>::iterator it = tegs.begin(); it != tegs.end(); it ++)
        cout << *it << endl;
 
    system("pause");
    return 0;
}
Подскажите теперь пожалуйста, как опустить строку в нижний регистр?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
02.11.2013, 02:22 6
C++
1
2
for (std::string::size_type i=0; i<str.length(); ++i)
    str[i] = std::tolower(str[i],loc);
както так
1
9 / 9 / 1
Регистрация: 28.03.2013
Сообщений: 82
02.11.2013, 02:29  [ТС] 7
Всем большое спасибо за вдохновение.
вот задача, и решение, может пригодится кому:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <fstream>
#include <list>
#include <string>
using namespace std;
 
bool EqualDash (string & str1, string & str2) {
    if (str1[1] == '/')
        return str1.erase(1,1) == str2;
    else 
        return str1 == str2;
}
 
int main() {
 
    ifstream fileReader;
    fileReader.open("input.txt");
 
    ofstream fileWriter;
    fileWriter.open("output.txt");
 
    list<string> tegs;
    
    while (!fileReader.eof()) {
        string str, teg;
        getline(fileReader,str);
        int t1 = 0, t2 = 0;
        bool first = true;
        do {
            t1 = t2;
            if (first)
                t1 = str.find('<', t1);
            else 
                t1 = str.find('<', t1 + 1);
            t2 = str.find('>', t1 + 1);
            if ((t2 - t1) > 1 && t1 >= 0 && t2 >= 0 &&
                ((str[t1 + 1] >= 'A' && str[t1 + 1] <= 'z') || 
                ((str[t1 + 1] == '/') && (str[t1 + 2] >= 'A' && str[t1 + 2] <= 'z')))) {
                teg.assign(str,t1,(t2 - t1) + 1);
 
                if (teg[1] == '/')
                for (int i = 2; i < teg.length() - 1; i++)
                    teg[i] = tolower(teg[i]);
                else 
                    for (int i = 1; i < teg.length() - 1; i++)
                    teg[i] = tolower(teg[i]);
 
                tegs.push_back(teg);
            }
        } while (t1 >= 0 && t2 >= 0);
    }
    tegs.sort();
    tegs.unique(EqualDash);
    tegs.sort();
    tegs.unique();
    for (list<string>::iterator it = tegs.begin(); it != tegs.end(); it ++)
        fileWriter << *it << endl;
 
    system("pause");
    return 0;
}
Миниатюры
Удаление похожих строк в списке  
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
02.11.2013, 02:41 8
Цитата Сообщение от Almost29 Посмотреть сообщение
Подскажите теперь пожалуйста, как опустить строку в нижний регистр?
C++
1
std::transform(str.begin(), str.end(), str.begin(), tolower);
0
02.11.2013, 02:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2013, 02:41
Помогаю со студенческими работами здесь

Поиск похожих строк
Добрый день. Прошу сильно не ругаться за возможные ошибки. Можете помочь решить данную проблему с...

Найти пары похожих строк матрицы
две строки матрици назовем похожими, если они отличаются только порядком элементов. найти пары...

Совмещение похожих позиций и сложение строк
Дорогие профессионалы Прошу помочь в одном приеме в Excel Мне необходимо соединить дублирующиеся...

Двумерная матрица. Найти количество похожих строк.
Дана целочисленная матрица размера M x N. Различные строки матрицы назовем похожими, если попарно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru