Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908

Найти все записи вектора А присутствующие в векторе В

10.05.2023, 08:21. Показов 1862. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здрасте!
Задачка следующая.
Есть 2 вектора А и В.
Вектор А получен чтением из файла.
Вектор В получен рекурсивным сканированием дериктории
Необходимо создать вектора С, в котором будет:
все записи из вектора А за исключением отсутствующих в векторе В,
а так же отсутствующих в векторе А, но присутствующих в векторе В.
Содержимое векторов примерно следующее:
Кликните здесь для просмотра всего текста
product/app 0 0 0755
product/app/Aperture 0 0 0755
product/app/Aperture/Aperture.apk 0 0 0644
product/app/Aperture/oat 0 0 0755
product/app/Aperture/oat/arm64 0 0 0755
product/app/Aperture/oat/arm64/Aperture.odex 0 0 0644
product/app/Aperture/oat/arm64/Aperture.vdex 0 0 0644
product/app/Backgrounds 0 0 0755
product/app/Backgrounds/Backgrounds.apk 0 0 0644
product/app/DeskClock 0 0 0755
product/app/DeskClock/DeskClock.apk 0 0 0644
product/app/DeskClock/oat 0 0 0755
product/app/DeskClock/oat/arm64 0 0 0755
product/app/DeskClock/oat/arm64/DeskClock.odex 0 0 0644
product/app/DeskClock/oat/arm64/DeskClock.vdex 0 0 0644
product/app/Etar 0 0 0755
product/app/Etar/Etar.apk 0 0 0644
product/app/Etar/oat 0 0 0755
product/app/Etar/oat/arm64 0 0 0755
product/app/Etar/oat/arm64/Etar.odex 0 0 0644
product/app/Etar/oat/arm64/Etar.vdex 0 0 0644
product/app/ExactCalculator 0 0 0755
product/app/ExactCalculator/ExactCalculator.apk 0 0 0644
product/app/ExactCalculator/oat 0 0 0755
product/app/ExactCalculator/oat/arm64 0 0 0755
product/app/ExactCalculator/oat/arm64/ExactCalculator.odex 0 0 0644
product/app/ExactCalculator/oat/arm64/ExactCalculator.vdex 0 0 0644
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2023, 08:21
Ответы с готовыми решениями:

В векторе. Найти наименьший четный элемент вектора и поменять с первым элементом
Добрый день! Столкнулся с трудностями при решении задачи - Найти наименьший четный элемент вектора и поменять с первым элементом. Var ...

Если в векторе А минимальный положительный элемент встретился один раз, то заменить все большие его элементы вектора на
произведение индексов максимального положительного и отрицательного элементов. Сделать на VBA

Найти все палиндромы, размером меньше числа n в векторе
Решаю задачу по нахождению всех палиндромов из вектора которые длиной не больше n. Я написал следующую программу: #include...

56
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 11:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от blackeangel Посмотреть сообщение
А повторные записи это как
с одинаковым ключом. Тот, который до пробела. Такое возможно?
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
12.05.2023, 11:31  [ТС]
Алексей1153, такое не возможно, тк невозможно создать в одной и той же директории файл/дерикторию с тем же именем, что уже есть...

Добавлено через 5 минут
Но, теоретически это возможно, когда будет и файл и папка с одинаковым именем. Поэтому оставляем повторы
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 11:34
Цитата Сообщение от blackeangel Посмотреть сообщение
Поэтому оставляем повторы
и как же их тогда сравнивать при поиске замены?
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
12.05.2023, 11:40  [ТС]
Алексей1153, смотреть кто из них папка, а кто файл
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 13:21
blackeangel, так путь же не разделяется на папку и файл. То есть, можно считать, что нет повторов
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
12.05.2023, 13:22  [ТС]
Для этого достаточно посмотреть на i+1 строку. Если там есть папка/ то это папка, если нет, то это файл или пустая папка. Если папка пустая, то пофиг на неё. Как то так. Но вероятность появления с одинаковым именем в одной и той же папке и файла и дериктории крайне мала, поэтому только такой подход. Либо же через filesystem проверять что это за зверь и по массиву двигаться дальше, в поисках второго совпадения.
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 13:26
Лучший ответ Сообщение было отмечено blackeangel как решение

Решение

Цитата Сообщение от blackeangel Посмотреть сообщение
Для этого достаточно посмотреть на i+1 строку.
зачем? Сохраняй полные пути, так будет проще. И не будет повторов. Я исхожу из этого.

как-то так
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
#include <fstream>
#include <filesystem>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cassert>
 
#define TESTING 1
 
struct s_item
{
private:
    std::string raw_data;//строка без изменений
    size_t key_len{};//длина ключа
    size_t index{};//индекс в неотсортированном массиве
    
public:
    s_item()=default;
    s_item(const s_item&)noexcept=default;
    s_item(s_item&&)noexcept=default;
    s_item& operator=(const s_item&)=default;
    s_item& operator=(s_item&&)noexcept=default;
    
    s_item(const std::string_view& raw_data_view,const size_t index):raw_data(raw_data_view),index(index)
    {
        const auto pos=raw_data.find(' ');
 
        if(pos==raw_data.npos)
        {
            key_len=raw_data.size();
        }
        else
        {
            key_len=pos;
        }
    }
    
    auto constexpr GetIndex()const noexcept
    {
        return index;
    }
    
    void CopyAllButIndex(const s_item& source)
    {
        const auto old_index=index;
        *this=source;
        index=old_index;
    }
 
    std::string_view GetView()const noexcept
    {
        assert(key_len<=raw_data.size());
        return {raw_data.data(),key_len};
    }
 
    friend bool operator<(const s_item& l,const s_item& r)noexcept
    {
        return l.GetView()<r.GetView();
    }
 
    friend bool operator==(const s_item& l,const s_item& r)noexcept
    {
        return l.GetView()==r.GetView();
    }
    
    friend std::ostream& operator<<(std::ostream& os, const s_item l)
    {
        os<<l.raw_data;
        return os;
    }
};
 
std::vector<s_item> readlines(const std::string &file)
{
    #ifdef TESTING
    return
    {
    //  {"111 A_dfdfg",0},
        {"888 A_dfgdfg",0},
        {"333 A_fgfgh1",0},
        {"444 A_fgfgh2",0},
        {"555 A_fgfgh3",0},
        {"777 A_cvfgh",0},
        {"999 A_cvfgh",0},       
    };
    #endif
    
    std::vector<s_item> lines;
    lines.reserve(256);
    
    std::ifstream open_file(file);
    for (std::string line; getline(open_file, line);)
    {
        //const auto index =lines.size();
        lines.emplace_back(line,0/*index*/);
    }
    open_file.close();
    return lines;
}
 
std::vector<s_item> recursive_dir(const std::string &path)
{
    #ifdef TESTING
    return
    {
        {"999 B_dfdfg",0},
//      {"888 B_dfgdfg",1},
        {"333 B_fgfgh1",2},
        {"555 B_fgfgh2",3},
        {"666 B_fgfgh3",4},
//      {"777 B_cvfgh",5},
        {"111 B_cvfgh",6},       
    };
    #endif
    
    std::vector<s_item> folder_files;
    folder_files.reserve(256);
    
    for (const auto &p : std::filesystem::recursive_directory_iterator(path))
    {
        if (std::filesystem::is_symlink(p))
        {
            auto v = std::filesystem::read_symlink(p);
            std::stringstream stream;
            stream << p.path().string() << " " << v.string();
            const auto index =folder_files.size();
            folder_files.emplace_back(stream.str(),index);
        }
        else
        {
            const auto index =folder_files.size();
            folder_files.emplace_back(p.path().string(),index);
        }
    }
    return folder_files;
}
 
int main()
{
    std::filesystem::path fsconfig;
    std::filesystem::path foldername;
    #ifdef TESTING
    #else
    fsconfig = "/data/local/UnpackerSystem/config/system/system_fs_config";
    foldername = "/data/local/UnpackerSystem/system";
    #endif
    
    auto A = readlines(fsconfig);
    auto B = recursive_dir(foldername);
  
    //временно отсортируем согласно предикату.
    //Потом B вернём обратно
    std::sort(A.begin(), A.end());
    std::sort(B.begin(), B.end());
    
    //если вдруг понадобится убирать повторные записи, то так:
    //Оставляем только уникальные записи
    //A.erase(std::unique(A.begin(), A.end()),A.end());
    //B.erase(std::unique(B.begin(), B.end()),B.end());
 
    for(auto& b:B)
    {
        auto it_A=std::lower_bound(A.begin(), A.end(), b);
        if(it_A!=A.end() && *it_A == b)
        {
            b.CopyAllButIndex(*it_A);
        }
    }
    
    //возвращаем изначальную сортировку B
    std::sort(B.begin(), B.end(),[](const auto& l,const auto& r)
    {
        return l.GetIndex()<r.GetIndex();
    });
 
    //выводим B на экран
    std::copy(B.begin(),B.end(),std::ostream_iterator<s_item>(std::cout,"\n"));
}
Добавлено через 30 секунд
999 A_cvfgh
333 A_fgfgh1
555 A_fgfgh3
666 B_fgfgh3
111 B_cvfgh
1
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
12.05.2023, 13:28  [ТС]
Алексей1153, так они и так полные
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 13:32
Цитата Сообщение от blackeangel Посмотреть сообщение
так они и так полные
тогда ключи должны быть сами по себе уникальными
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
12.05.2023, 14:07  [ТС]
Алексей1153, сравнил полученные при формировании при помощи перебора и при помощи вашей программы. Что то где то пошло не так...
Вложения
Тип файла: zip system2.zip (46.1 Кб, 3 просмотров)
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 14:18
blackeangel, два файла - это результаты от разных программ?
гит показывает, что пропали хвосты у некоторых записей


щас попробую с тестовым набором из предыдущего архива
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
12.05.2023, 14:24  [ТС]
Алексей1153, Алексей1153, это я накосячил
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 14:26
blackeangel, такое очучение, что пути по двое через пробел сложены , да ? ))
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
12.05.2023, 14:27  [ТС]
Всё верно работает.
Спасибо за помощь!

Добавлено через 52 секунды
Алексей1153, это symlink и то куда он ссылается
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 14:28
в system.zip тоже такие записи есть. Я думаю, у меня всё нормально должно быть, я же на тестовых строках проверил.
Просто разберись со входными строками у себя
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
12.05.2023, 14:31  [ТС]
Алексей1153, да уже разобрался, забыл строку раскоментить в
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
std::vector<s_item> recursive_dir(const std::filesystem::path &path)
{
    #ifdef TESTING
    return
    {
        {"999 B_dfdfg",0},
//      {"888 B_dfgdfg",1},
        {"333 B_fgfgh1",2},
        {"555 B_fgfgh2",3},
        {"666 B_fgfgh3",4},
//      {"777 B_cvfgh",5},
        {"111 B_cvfgh",6},       
    };
    #endif
    
    std::vector<s_item> folder_files;
    folder_files.reserve(256);
    std::string folder_parents = path.parent_path().string() + "/";
    for (const auto &p : std::filesystem::recursive_directory_iterator(path))
    {
        if (std::filesystem::is_symlink(p))
        {
            auto v = std::filesystem::read_symlink(p);
            std::stringstream stream;
            std::string f = p.path().string();
            std::string el = replace(f, folder_parents, "");
            stream << el << " " << v.string(); //вот тут было: //v.string();
            const auto index =folder_files.size();
            folder_files.emplace_back(stream.str(),index);
        }
        else
        {
             std::string f = p.path().string();
            std::string el = replace(f, folder_parents, "");
            const auto index =folder_files.size();
            folder_files.emplace_back(el,index);
        }
    }
    return folder_files;
}
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
12.05.2023, 14:52
Цитата Сообщение от blackeangel Посмотреть сообщение
folder_files.reserve(256);
а вот эту циферку я поставил от балды, но можно в обоих функциях запоминать последнее значение и резервить в следующий раз столько. Будет быстрее собирать, так как будет меньше реаллокаций. Но это для случая, если вызовы этих функций частые

Добавлено через 8 минут
Цитата Сообщение от blackeangel Посмотреть сообщение
auto v = std::filesystem::read_symlink(p);
            std::stringstream stream;
            std::string f = p.path().string();
            std::string el = replace(f, folder_parents, "");
            stream << el << " " << v.string(); //вот тут было: //v.string();
            const auto index =folder_files.size();
            folder_files.emplace_back(stream.str(),i ndex);
тут stream не нужен:

C++
1
2
3
4
            auto v = std::filesystem::read_symlink(p);
            std::string el = replace(p.path().string(), folder_parents, "")+" "+v.string();
            const auto index =folder_files.size();
            folder_files.emplace_back(el,index);
а если для s_item добавить ещё вариант конструктора с перемещением строки s_item(std::string&& raw_data_view,const size_t index), то можно сбор строк ещё чуток ускорить
C++
1
2
3
....
folder_files.emplace_back(std::move(el),index);
....
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.05.2023, 14:52
Помогаю со студенческими работами здесь

В векторе-столбце произвольной длины найти все отрицательные/положительные элементы
Здравствуйте подскажите как выполнить это в маткаде. в векторе-столбце произвольной длины позволяет найти все отрицательные/положительные...

Найти и вывести все числа, которые присутствуют в векторе более одного раза
// 2) a = // Найти и вывести все числа, которые присутствуют в списке более одного раза. пытался вот как то так) // 2) a = //...

Как увидеть все переменные присутствующие в скрипте?
Добрых суток! Возник вопрос. Как можно (если есть такие возможности) увидеть все переменные скрипта? Например получаю из массива ряд...

Вывести все различные буквы, присутствующие во введенной строке
Нужно чтобы мы вводили с клавиатуры строку(например: hello lena) и нам в результате выводило все различные буквы, тогда должно вывести h e...

Выбрать все элементы массива A, присутствующие в массиве B один раз
Даны два одномерных массива целых чисел A и В. Вычислить одномерный массив С, который содержит все элементы массива A, присутствующие в...


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

Или воспользуйтесь поиском по форуму:
57
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru