Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 1
Регистрация: 26.08.2015
Сообщений: 45

Сравнение списков

28.11.2016, 06:19. Показов 1575. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Попросили на писать программу для сравнения списоков.

Написал:

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
    TStringList *list1 = new TStringList;
    list1->Sorted = true;
    list1->Duplicates = System::Classes::dupIgnore;
    TStringList *list2 = new TStringList;
    list2->Sorted = true;
    list2->Duplicates = System::Classes::dupIgnore;
    list1->LoadFromFile(GetCurrentDir()+"\\database.txt");
    list2->LoadFromFile(GetCurrentDir()+"\\new_list.txt");
    for (int i = 0; i < list2->Count; i++) {
        String temp = list2->Strings[i];
        int tempi;
        if (list1->Find(temp,tempi)) {
            list2->Delete(i);
            i = i-1;
        }
        else
        {
            list1->Add(temp);
        }
    }
 
    list2->SaveToFile(GetCurrentDir()+"\\new_list.txt");
    if (Form1->CheckBox1->Checked==true) {
        list1->SaveToFile(GetCurrentDir()+"\\database.txt");
    }
    list1->Clear();
    list2->Clear();
    list1->Free();
    list2->Free();

Жалуются что список 1млн и 1.5млн сравниваются почти час. Возможно ли ускорить?

Добавлено через 5 минут
Есть 2 списка. database.txt и new_list.txt.
Нужно удалить из списка 2 все строки которые встречаются в списке 1. Сохранить и дописать список 2 к списку 1.


Не смог отредактировать сообщение тк прошло 5 мин(
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2016, 06:19
Ответы с готовыми решениями:

Сравнение списков
Есть 2 списка (стринг листа) 1 список 1 2 3 1 1 2 и

Сравнение списков
Написать функцию, которая проверяет, состоят ли два заданных списка из одних и тех же элементов (независимо от порядка их расположения) ...

Сравнение списков
Добрый день. Есть два списка, которые надо добавить в третий. Например, Список один: attribute1, слово attribute2, слово2 ...

30
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
28.11.2016, 09:28
Цитата Сообщение от KOTYAREG Посмотреть сообщение
Нужно удалить из списка 2 все строки которые встречаются в списке 1.
Вот так пошустрей будет
std::set_difference
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
#include <iostream> 
#include <fstream> 
#include <algorithm>    
#include <vector>       
#include <string> 
#include <iterator> 
int main()
{
 
    std::ifstream infile1("D:\\database.txt");
    std::ifstream infile2("D:\\new_list.txt");
 
    std::vector<std::string> list1(std::istream_iterator<std::string>(infile1), {});
    std::vector<std::string> list2(std::istream_iterator<std::string>(infile2), {});
    
    // контейнеры должны быть отсортированы
    std::sort(list1.begin(), list1.end());
    std::sort(list2.begin(), list2.end());
 
    std::vector<std::string> vecDif(1000000);       
    std::vector<std::string>::iterator it;
 
    it = std::set_difference( list2.begin(), list2.end(), list1.begin(), list1.end(), vecDif.begin());
    vecDif.resize(it - vecDif.begin()); 
 
    // теперь полученная разница  это список list2
    list2 = vecDif;
 
    //дописать список 2 к списку 1
    list1.insert(list1.end(), list2.begin(), list2.end());
 
    //Сохранить
    std::ofstream output_file("outfile.txt");
    std::ostream_iterator<std::string> output_iterator(output_file, "\n");
    std::copy(list1.begin(), list1.end(), output_iterator);
 
    std::cin.get();
    return 0;
}
2
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
28.11.2016, 11:19
John999, самому интересно...только ни как не могу Ваш код запустить на BCB. Вы то сами в какой среде это делали?
0
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
28.11.2016, 11:35
Visual Studio (здесь можно произносить ? )
VS 2015 Express for Desktop
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
28.11.2016, 11:38
John999, ну а вы то сами попробуйте подключить что написали к BCB (все ни как раздел для на для вижуал студио) =))
0
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
28.11.2016, 11:40
BCB ? не .. не слышал.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
28.11.2016, 11:40
Цитата Сообщение от John999 Посмотреть сообщение
BCB ? не .. не слышал
А почему тогда в этом разделе постите?)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,882
Записей в блоге: 12
28.11.2016, 11:41
Dinkin, в чем проблема-то? В XE4 под Win64 прекрасно собирается код (для использования C++11 нужно именно 64-битное приложение, по крайней мере в XE4, не знаю, что там в новых)
0
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
28.11.2016, 11:42
Цитата Сообщение от Dinkin Посмотреть сообщение
А почему тогда в этом разделе постите?)
Приспособить то можно. Там немного исправлять. НЕт у меня билдера,
поэтому и проверить не смогу.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
28.11.2016, 12:02
точняк, под 64 все прекрасно работает =)

Добавлено через 8 минут
Но вроде как есть еще быстрее способ....путем стандартных фишек у TStringList, без подключения доп библиотек:

C++
1
2
3
4
5
6
7
8
9
 TStringList *list1 = new TStringList;
 TStringList *list2 = new TStringList;
 
 list1->Duplicates = System::Classes::TDuplicates::dupIgnore;
 
 list1->LoadFromFile("database.txt");
 list2->LoadFromFile("new_list.txt");
 
 list1->Insert(2, list2->Text.Delete(list2->Text.Length() - 1, 2));
Но он дольше...это так.для справки просто

Добавлено через 2 минуты
А нет отказался даже в 15 раз быстрее.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.11.2016, 14:35
Dinkin, а разве не нужно сортировать предварительно?
C++
1
2
list1->Seorted = true;
list1->Duplicates = System::Classes::TDuplicates::dupIgnore;
0
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
28.11.2016, 14:36
Цитата Сообщение от Dinkin Посмотреть сообщение
C++
1
2
3
4
list1->Duplicates = System::Classes::TDuplicates::dupIgnore;
list1->LoadFromFile("database.txt");
*list2->LoadFromFile("new_list.txt");
list1->Insert(2, list2->Text.Delete(list2->Text.Length() - 1, 2));
Поправлюсь
что то правда с утра намудрил. Этож уважаемому ТС нужно слить
два файла в один без дубликатов ? и всё. К чему тогда эти перетасовки, удаления.
Можно же всё в один std::set соединить:
Если чуть больше миллиона строк в файлах,
на пяти ядрах время работы 5-6 мин.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream> 
#include <fstream> 
#include <algorithm>    
#include <set>    
#include <string> 
#include <iterator> 
int main()
{
    std::ifstream infile1("D:\\database.txt");
    std::ifstream infile2("D:\\new_list.txt");
 
    std::set<std::string> myset(std::istream_iterator<std::string>(infile1), {});
    std::copy(std::istream_iterator<std::string>(infile2),
        std::istream_iterator<std::string>(),
        std::inserter(myset, myset.end()));
 
    std::ofstream output_file("outfile.txt");
    std::ostream_iterator<std::string> output_iterator(output_file, "\n");
    std::copy(myset.begin(), myset.end(), output_iterator);
 
    std::cin.get();
    return 0;
}
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.11.2016, 14:39
Цитата Сообщение от volvo Посмотреть сообщение
Dinkin, в чем проблема-то? В XE4 под Win64 прекрасно собирается код (для использования C++11 нужно именно 64-битное приложение, по крайней мере в XE4, не знаю, что там в новых)
Я лично не вижу почему указанный код не должен компилиться старым компилятором под x32

Единственное непонятно почему в коде не используется v.reserve() и inserter
0
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
28.11.2016, 14:41
Цитата Сообщение от Avazart Посмотреть сообщение
в коде не используется inserter
используется, местами )
Цитата Сообщение от John999 Посмотреть сообщение
C++
1
std::inserter(myset, myset.end()));
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
28.11.2016, 14:46
Цитата Сообщение от Avazart Посмотреть сообщение
Я лично не вижу почему указанный код не должен компилиться старым компилятором под x32
У меня на 32х не хавает, и жалуется что неполносью обявлена
C++
1
std::vector<std::string> list1(std::istream_iterator<std::string>(infile1), {});
А на 64 все хавает =)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.11.2016, 14:48
Кстати с std::set<> может быть медленнее.

Добавлено через 54 секунды
Цитата Сообщение от Dinkin Посмотреть сообщение
У меня на 32х не хавает, и жалуется что неполносью обявлена
Ну так переписать?
0
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
28.11.2016, 14:50
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати с std::set<> может быть медленнее.
Да , но проверил несколько раз заменив vector std::set
Почти в два раза быстрее выходит. ( с std::set)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.11.2016, 14:53
Цитата Сообщение от John999 Посмотреть сообщение
Да , но проверил несколько раз заменив vector std::set
Почти в два раза быстрее выходит. ( с std::set)
Потому что reserve не используешь скорее всего.

Цитата Сообщение от Dinkin Посмотреть сообщение
У меня на 32х не хавает, и жалуется что неполносью обявлена
C++
1
std::vector<std::string> list1(std::istream_iterator<std::string>(infile1), {});
Если не ошибаюсь то так
C++
1
2
std::vector<std::string> list1(std::istream_iterator<std::string>(infile1), 
                               std::istream_iterator<std::string>());
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
28.11.2016, 14:53
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так переписать?
я вот думал это готовый вариант.... впервые столкнулся, что 64 не ладит с 32 в коде......в обще это наводит на мысль, что нормального CLANGа так и нет для 32 битного компилятора в RadStudio)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.11.2016, 14:55
Цитата Сообщение от Dinkin Посмотреть сообщение
CLANGа так и нет для 32 битного компилятора в RadStudio)
Мм а там CLANG x32 ? Раньше был старый bcb- компилятор.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2016, 14:55
Помогаю со студенческими работами здесь

Сравнение Списков
Доброго времени суток! Прошу помочь в следующем: Есть переменные А и В в которых разные списки с данными. Необходимо сравнить...

Сравнение списков
Доброго времени суток! Подскажите, пожалуйста, как написать программу, которая сравнивает по количеству элементов два списка.

Сравнение списков
Добрый день! Помогите пожалуйста. У меня есть 2 разных списка public List&lt;postgreconnect.posgreconnect.Sinxron&gt; newbd = new...

Сравнение списков
Доброго времени суток . Нужен небольшой совет по программе . Есть 2 списка (стандартный STL-кий класс list ) , нужно сравнить их на...

Сравнение списков STL
не работает функция сравнения списков STL, в частности fNumber и sNumber почему-то принимают значение 0 int bigger(list&lt;int&gt;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru