Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83

Сравнение символов со строкой

14.02.2023, 21:40. Показов 1553. Ответов 31

Студворк — интернет-сервис помощи студентам
Всем читающим привет

Я делаю проект(оптимизатор кода) свой и столкнулся с проблемой перебора символов в строках и последующим сравнением, т.е.:

Т.е. есть у меня такой вектор
C++
1
std::vector<std::string> RegConstants;
туда помещается такая строка, их может быть хоть миллион, т.е. любое количество
Assembler
1
ImmOfStack_CustomConst_1(RDIx8)(ζ)[Φ1]
Мне нужно перебрать все элементы и символы в них, дабы найти, например это RDIx8, т.е. мне нужно перебрать все символы всех элементов, чтобы найти символы обозначения регистров.

Вот мой глючный пример:
Под RegName любой 64-ех битный регистр, т.е. RAXx1 и т.д., далее там у меня зависимости от [Φ, которые будут идти от моего IR кода ,но я сомневаюсь, что эта информация будет полезна, что важно - как я могу сравнить это:
ImmOfStack_CustomConst_1(RDIx8)(ζ)[Φ1] с этим RDIx8?
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
void RegImmConstantFinderInVectorOfRegConstants(std::string RegName)
            {
                if (RegConstants.size() > 0)
                {
                    for (auto it = RegConstants.begin(); it < RegConstants.end(); it++)
                    {
                        int64_t Index = std::distance(RegConstants.begin(), it);
                        
                        char* CharStringWithTempVarFromReg = new char[RegConstants[Index].length() + 1];
                        strcpy(CharStringWithTempVarFromReg, RegConstants[Index].c_str());
 
                        char* CharRegName = new char[RegName.length() + 1];
                        strcpy(CharRegName, RegName.c_str());
                        for (int j = 0; j < RegConstants[Index].length(); j++)
                        {
                            for (int v = 0; v < RegName.length(); v++)
                            {
                                if (CharStringWithTempVarFromReg[j] == CharRegName[v])
                                {
                                    fmt::print("{}", RegName);
                                }
                            }
                        }
                    }
                }
            }
Я был бы рад какому-нибудь подробному примеру, желательно с использованием stl или более нормальному и быстрому примеру, чем мой, а также более работоспособному, так как сейчас у меня выводится это:
https://ibb.co/GCrLF9n

Как я понимаю выводится дичь выше из-за того, что тут(CharRegName) тоже всё идет по символам и когда находится буква I в RDIx8, то оно видит начало той переменной Imm и сразу выводит RDIx8.

Как я могу в векторе по символьным поиском по всем элементам искать нужные мне элементы?
Т.е. в реальном примере будет так:
ImmOfTextSection(RAXx8)(ζ)[Φ1]
ImmOfStack_CustomConst_1(RDIx8)(ζ)[Φ1]

и я соответственно передаю туда RegName, чтобы найти от чего идет моя переменная от регистра RAX или RDI или R15
ζ - это показывает, что регистр сохранен в стеке.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2023, 21:40
Ответы с готовыми решениями:

Cтрока: вывести в файл все возможные сочетания символов начиная с A, и заканчивая строкой в 16 символов состоящую из Z
Изучая работу со строками в c++ столкнулся с задачей. Есть массив символов английского алфавита от &quot;a&quot; до &quot;Z&quot;, мне...

Сравнение со строкой из файла
Подскажите пожалуйста,как написать сравнение введённой информацией с каждой строкой в имеющемся файле,потому что у меня сравнивается только...

Сравнение хеша md5 с строкой
Здраствуйте. Получен MD5 код некого файла - 8F5B9B73D33E8C99202B5058CB6DCE51 в typedef TMD5. Что нужно сделать, чтобы это можно было...

31
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,104
14.02.2023, 22:08
Лучший ответ Сообщение было отмечено OSPFv3 как решение

Решение

Цитата Сообщение от OSPFv3 Посмотреть сообщение
for (auto it = RegConstants.begin(); it < RegConstants.end(); it++)
                    {
                        int64_t Index = std::distance(RegConstants.begin(), it);
непонятное телодвижение. Можно сразу юзать it без добывания индекса

Цитата Сообщение от OSPFv3 Посмотреть сообщение
char* CharStringWithTempVarFromReg = new char[RegConstants[Index].length() + 1];
                 
char* CharRegName = new char[RegName.length() + 1];
жуткая утечка памяти.


--------------
вектор можно хранить в отсортированном виде и искать строку при помощи std::binary_search

или ещё можно использовать std::set<std::string> вместо вектора. Там само всё сортироваться будет, поиск будет быстрый

Добавлено через 2 минуты
(set будет побольше памяти жрать)
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
14.02.2023, 22:15  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
непонятное телодвижение. Можно сразу юзать it без добывания индекса


жуткая утечка памяти.


--------------
вектор можно хранить в отсортированном виде и искать строку при помощи std::binary_search

или ещё можно использовать std::set<std::string> вместо вектора. Там само всё сортироваться будет, поиск будет быстрый
Спасибо за аргументированную критику кода!

Мне переменные нужно возвращать как структуру и работать с нею, так как там есть параллельный вектор со значениями этих переменных, если хотите и у вас есть время могу скинуть полный код на pastebin, сможете посмотреть?

Могу я увидеть пример с использованием std::binary_search?, заодно посмотрю на ваш код, пойму как писать нужно, я же тут не для того, чтобы курсовую сделать

Добавлено через 3 минуты
(set будет побольше памяти жрать)
Насчет больше памяти жрать, это я боюсь, так как у меня 24гига и мне .exe файл нужно поднимать размером в 500мибов, а дальше ещё больше до AST дерева, т.е. IR вида, т.е. трехадресного кода, который вы видите выше
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,104
14.02.2023, 22:18
Лучший ответ Сообщение было отмечено OSPFv3 как решение

Решение

Цитата Сообщение от OSPFv3 Посмотреть сообщение
Мне переменные нужно возвращать как структуру и работать с нею, так как там есть параллельный вектор со значениями этих переменных
предлагаю варианты контейнера:

1) std::map<std::string,mystruct>//проще в использовании
2) std::vector<std:: pair<std::string,mystruct>>//меньше жрёт памяти

Цитата Сообщение от OSPFv3 Посмотреть сообщение
Могу я увидеть пример с использованием std::binary_search
там же, по ссылке, есть пример

Цитата Сообщение от OSPFv3 Посмотреть сообщение
если хотите и у вас есть время могу скинуть полный код
нет, не хочу

Добавлено через 1 минуту
для поддержания вектора в отсортированном виде - место вставки нужно искать std::lower_bound
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 01:22  [ТС]
предлагаю варианты контейнера:

1) std::map<std::string,mystruct>//проще в использовании
2) std::vector<std:: pair<std::string,mystruct>>//меньше жрёт памяти
Щя, я только изучу, что такое std::map и чем отличается от std::vector, а также, что такое std:;pair, тогда тоже чуть-чуть позже вопросик задам, если не смогу что-то понять с их практической реализацией
там же, по ссылке, есть пример
Ух, не заметил, сейчас попробую реализовать std::binary_search, если что то тоже вопрос задам сюда в темку тогда
нет, не хочу
Вас понял!
для поддержания вектора в отсортированном виде - место вставки нужно искать std::lower_bound
Спасибо!

Добавлено через 2 часа 54 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
вектор можно хранить в отсортированном виде и искать строку при помощи std::binary_search
А как я могу возвращать значение итератора или элемента, который является true?

Т.е. сам std::binary_search не позволяет даже функцию в себе вызвать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool RegImmConstantFinderInVectorOfRegConstants(std::string RegName)
            {
                
                if (RegConstants.size() > 0)
                {
                    int i = 0; i++;
 
                    auto it{ std::binary_search(RegConstants.begin(), RegConstants.end(), RegName) };
                    std::cout << "Element: " << i;
 
                    return it;
                }
                return false;
            }
 
std::binary_search(RegConstants.begin(), RegConstants.end(), RegImmConstantFinderInVectorOfRegConstants(RegName));
Жалуется на ошибку... А std::equal_range и т.п. возвращают std:air...
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
15.02.2023, 04:02
Я конечно в плюсах баран....

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
void RegImmConstantFinderInVectorOfRegConstants(std::vector<std::string> &vec, std::string RegName)
    {
if (vec.size() > 0)
    {
for (int Index = 0; Index < vec.size(); Index++)
        {
            size_t pos = vec[Index].find(RegName);
if (pos != std::string::npos)
std::cout << "Found at Index = " << Index << "     Found at pos = " << pos + 1 << "\n";
            
        }   }      }
 
 
int _tmain()
{
std::vector<std::string> RegConstants
    { "My mother is very kind",// 0
                           "kjn tyuio",// 1
      "Then she usually reads",// 2
                       "Hello world",// 3
"She has a very pleasant smile",// 4
      "very hardworking man",// 5
"There are five of us – my parents",
    "fgtyu",
    "fghjk" };
 
RegImmConstantFinderInVectorOfRegConstants(RegConstants,"pleasant");
 
std::cin.get();
    return 0;
}
1
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
15.02.2023, 07:34
Цитата Сообщение от Наталья8 Посмотреть сообщение
if (vec.size() > 0)
Не нужно...
Вот это все
C++
1
2
3
4
5
6
7
for (int Index = 0; Index < vec.size(); Index++)
        {
            size_t pos = vec[Index].find(RegName);
if (pos != std::string::npos)
std::cout << "Found at Index = " << Index << "     Found at pos = " << pos + 1 << "\n";
            
        }   }
меняем на
C++
1
2
3
4
5
6
7
8
void RegImmConstantFinderInVectorOfRegConstants(const std::vector<std::string> &vec, const std::string &RegName) {
 for_each(vec.begin(),vec.end(),[&RegName](const string &val) {
   size_t pos =  val.find(RegName);
   if( pos != string::npos) {
     cout << "Found at pos = " << pos + 1 << "\n";
   }
 });
}
1
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,104
15.02.2023, 07:43
Цитата Сообщение от OSPFv3 Посмотреть сообщение
А как я могу возвращать значение итератора или элемента, который является true?
да, моя неточность - указанная выше функция определяет просто наличие ключа. Для поиска объекта нужно применять std::lower_bound (вернёт end() или итератор на следующий ключ, если не найден итератор искомого ключа)

Добавлено через 2 минуты
вообще, чтобы облегчить отладку, можно для начала оформить в виде std::map<std::string,mystruct>

а потом сделать свою реализацию мапы на основе вектора
1
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
15.02.2023, 13:25
Где то я такое уже видел.
Вспомнил C++ Builder6...
Там правда поочевиднее. Меньше крючков, скобочек разных...
Есть ещё C++Cli...
Я вообще сторонник низкого уровня. Выше vector не лезу...

Добавлено через 8 минут
Но vector мне нравиться.
Как начинаешь грузить в двумерные массивы , да с realloc.
Глючно, муторно очень...

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
else {// Вставить одну строчку в массив (Удлиннить массив , если короткий)
                if (strlen(ms) + strlen(msg.c_str()) > volume-2){//<==== volume-2 подбирал, что бы добавление одного символа,
                    Beep(3000, 5); Sleep(5); Beep(3000, 5);//      вызывало срабатывание.(а то добавление вешало)
                    int length_share = strlen(ms);
                    // strlen(ms) -- Брать до realloc... После уже не покажет. там будет мусор
                    volume = (length_share + strlen(msg.c_str()) + 128);// Цифра 64 от фонаря, на ебанутый текст
                    ms = (char*)realloc(ms, volume);
                    *(ms + length_share) = '\0';//<==== После realloc, главное вставить на правильное место ноль. !!!
                    //memset(ms + length_share, 0, volume - length_share);//Обнулять пытался
                }
                strcat(ms, msg.c_str()); strcat(ms, "\r\n");// Что бы сделать в массив strcat, там должен стоять ноль
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.02.2023, 13:45
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а потом сделать свою реализацию мапы на основе вектора
А разве unordered_map не есть хеш-таблица ?

Алексей1153, объясни мне чего хочет автор темы, какая стоит задача ?
Поиск подстроки, или же парсер лексем ?
Может и ТС ответить, но судя по его стилю описания, я все равно ничего не пойму.
1
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,104
15.02.2023, 13:50
Цитата Сообщение от SmallEvil Посмотреть сообщение
Алексей1153, объясни мне чего хочет автор темы, какая стоит задача
пусть автор объясняет, я тоже не полностью понял Только сразу увидел некоторые очевидные ошибки
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 18:17  [ТС]
Такс, я проснулся

Я сегодня где-то в 5 часов утра понял как это сделать:

https://ibb.co/TvBZMHM


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
            void RegImmConstantFinderInVectorOfRegConstants(std::string RegName, Language_Letters Language_Letters, ZydisDisassembledInstruction instruction, int64_t RegisterValue)
            {
                int FromRegToDependencyInRegConstantsAndToCounter = 1;//(-1) Counter
                int FromRegToNameOfVarInRegConstants = 2;//(-2) NameOfVar
                if (RegConstants.size() > 0)
                {
                    auto it{ std::find(RegConstants.begin(), RegConstants.end(), RegName) };
                    if (it != RegConstants.end());
                    {
                        int i = std::distance(RegConstants.begin(), it);
                       // if (RegConstants[static_cast<std::vector<std::string, std::allocator<std::string>>::size_type>(i) + FromRegToDependencyInRegConstantsAndToCounter]
                       //     != 
                       //     Language_Letters.InstructionPointer + boost::lexical_cast<std::string>(ImmConstantCounter))
                        {
                            std::cout << RegConstants[i - FromRegToNameOfVarInRegConstants] << RegConstants[i - FromRegToDependencyInRegConstantsAndToCounter]
                                << "(" << RegName << ")" << SaveAndUnSaveChooser(instruction, Language_Letters) << "[" << RegConstants[i + FromRegToDependencyInRegConstantsAndToCounter]
                                << "," << Language_Letters.InstructionPointer << boost::lexical_cast<std::string>(ImmConstantCounter) << "]" << " = " << std::hex << RegisterValue << std::endl;
 
                            RegConstants.insert(it + FromRegToDependencyInRegConstantsAndToCounter, std::string(RegConstants[i + FromRegToDependencyInRegConstantsAndToCounter] + "," + 
                                Language_Letters.InstructionPointer + boost::lexical_cast<std::string>(ImmConstantCounter)));
                        }
                    }
                }
            }
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
            void FormaterAFillerOfRegsARegsConstants(std::string NameOfConstant, ZydisDisassembledInstruction instruction, Language_Letters Language_Letters,
                Constants StructConstants, int64_t RegisterValue, std::string RegName)
            {
                uint64_t Counter = 0;
 
                bool RegIsDecalare = std::binary_search(RegConstants.begin(), RegConstants.end(), RegName);
 
                if (RegIsDecalare == false)
                {
                    std::string temp(Registers::NameChooserByMnemonicForRegisters(NameOfConstant, instruction, StructConstants, RegisterValue) +
                        boost::lexical_cast<std::string>(ImmConstantCounter) + "(" + RegName + ")" + SaveAndUnSaveChooser(instruction, Language_Letters) +
                        Language_Letters.ConstantDependency + boost::lexical_cast<std::string>(ImmConstantCounter) + "]" + " = " + boost::lexical_cast<std::string>(fmt::format("{:x}", RegisterValue)));
 
                    RegConstants.push_back(Registers::NameChooserByMnemonicForRegisters(NameOfConstant, instruction, StructConstants, RegisterValue) +
                        boost::lexical_cast<std::string>(ImmConstantCounter) + "(" + RegName + ")" + SaveAndUnSaveChooser(instruction, Language_Letters) +
                        Language_Letters.ConstantDependency + boost::lexical_cast<std::string>(ImmConstantCounter) + "]");
 
                    RegConstants.push_back(Registers::NameChooserByMnemonicForRegisters(NameOfConstant, instruction, StructConstants, RegisterValue));
                    
                    RegConstants.push_back(boost::lexical_cast<std::string>(ImmConstantCounter));
 
                    RegConstants.push_back(RegName);
 
                    RegConstants.push_back(Language_Letters.InstructionPointer + boost::lexical_cast<std::string>(ImmConstantCounter));
 
 
                    fmt::print("{}\n", temp);
                }
                else
                {
                    RegImmConstantFinderInVectorOfRegConstants(RegName, Language_Letters, instruction, RegisterValue);
 
 
                }
 
                for (; Counter <= ConstantsByTFirstOp.size(); Counter++)
                {
                    auto it = ConstantsByTFirstOp[Counter].end();
                    if (ConstantsByTFirstOp.size() != 0)
                    {
                        auto it{ std::find(ConstantsByTFirstOp[Counter].begin(), ConstantsByTFirstOp[Counter].end(), RegisterValue) };
                    }
                    if (it == ConstantsByTFirstOp[Counter].end())
                    {
                        NameOfConstantsByTFirstOp.push_back(RegName + SaveAndUnSaveChooser(instruction, Language_Letters) +
                            Language_Letters.ConstantDependency + boost::lexical_cast<std::string>(ImmConstantCounter) + "]");
 
 
                        ConstantsByTFirstOp.emplace_back(std::vector<uint64_t>(Counter));
 
                        ConstantsByTFirstOp[Counter].push_back(RegisterValue);
 
                        break;
                    }
                }
            }
Если кратко то вчера мне подсказал Алексей1153 с тем, что сам вектор нужно отсортировать(я отсортировал сам вывод в вектор и как бы разложил это ImmOfStack_CustomConst_1(RDIx8)(θ)[Φ1,Φ2,Φ3] на части, убрав синтаксический сахар), а также мне Алексей1153 подсказал с некоторыми stl алгоритмами за что ему большое спасибо

Наталья8
Я конечно в плюсах баран...
Смотрите, у вас сам код занимает столько же строк сколько и у меня, но у меня есть все нужные проверки, а также форматирование массива и вывод данных => у вас менее оптимизированное решение, чем у меня сейчас => жрет больше => у меня интерпретатор основанный на эмуляторе(сам эмулятор(https://pastebin.com/6CVgwvqV)) для того, чтобы я мог интерпретировать ASM код самого PE файла с защитой DENUVO, в данный момент я делаю оптимизатор кода, деобфускатор, до этого я его делал на шаблонных техниках деобфускации кода((https://pastebin.com/RWZE7BdK))
((https://pastebin.com/zwH6YFrL[/url])), сейчас делаю на полукомпиляторных, суть того, что в этом коде(ниже ASM код) я ищу зависимости и исследую состояния

Assembler
1
2
3
4
5
PUSH 0x9639D
PUSH RDI
LEA RDI, QWORD PTR DS:[0x154340105]
XCHG QWORD PTR SS:[RSP], RDI
RET
Т.е. как видно на скрине выше будут отслеживаться графы и если под конец переменная в стеке от любого регистра равна одному из первых трех графов(будет отслеживаться регистр RIP), то я заменяю на JMP в данном случае 0x154340105 или любая другая, которая изменяется на переменную в секции tls(секция DENUVO VM) и при этом равняется одному из первых трех графов, также будут выводиться зависимости по самой переменно и тому, что она затрагивает, дабы не удалить лишний код.

Алексей1153
да, моя неточность - указанная выше функция определяет просто наличие ключа. Для поиска объекта нужно применять std::lower_bound (вернёт end() или итератор на следующий ключ, если не найден итератор искомого ключа)

Добавлено через 2 минуты
вообще, чтобы облегчить отладку, можно для начала оформить в виде std::map<std::string,mystruct>

а потом сделать свою реализацию мапы на основе вектора
вас понял, я сделал через std::find, в моём случае это подойдет, но в других случаях не подойдет почему:
std::find и std::lower_bound возвращает первый элемент, который соответствует условию, а вдруг там таких элементов около 4 штук и нужно находить все 4 штуки и возвращать итератор на все 4 штуки? То, что делать в таком случае? Есть какой-нибудь std::find_next?

Наталья8
Где то я такое уже видел.
Вспомнил C++ Builder6...
Там правда поочевиднее. Меньше крючков, скобочек разных...
Есть ещё C++Cli...
Я вообще сторонник низкого уровня. Выше vector не лезу...

Добавлено через 8 минут
Но vector мне нравиться.
Как начинаешь грузить в двумерные массивы , да с realloc.
Глючно, муторно очень...
3 месяца назад я программировал только на ASM не больше, я изучил С++, а точнее его синтаксис примерно за 24 часа, отсюда все проблемы вытекают, мне нужен С++ для конкретной задачи, так как на ASM я её буду реализовывать не год, а года два...
Так что я возможно больший сторонник низкого уровня, чем вы, но опять же стоит конкретная задача - не говнокодить и сделать всё красиво и быстро, я это пытаюсь сделать настолько, насколько позволяют мои знания!

SmallEvil
А разве unordered_map не есть хеш-таблица ?

Алексей1153, объясни мне чего хочет автор темы, какая стоит задача ?
Поиск подстроки, или же парсер лексем ?
Может и ТС ответить, но судя по его стилю описания, я все равно ничего не пойму.
То, что вы подумали - это фронтенд компиляторов или же лексер, в моём случае у меня IR представление кода, что характеризует греческая буква фи в начале и тому, что всё выражение равно ей, это сделано в первую очередь для того, чтобы нормально искать зависимости, т.е. в моём случае это трехадресный язык представления синтаксического дерева.
Лексер же генерирует токены для синтаксического анализатора, у меня же тут нету даже одного слова про упоминание токенов, я упоминал IR код, сейчас покажу: https://mega.nz/file/LpEHwB4T#... -tYlXhnrVY

Мы берем под пример переведенную на русский язык книгу дракона, конкретное издание - 2-ое aka purple dragon
Открываем 155 страницу 3-ий главы и читаем её. То, что я имел ввиду - 443 - 705 страница, т.е. читаем 6-ую главу, а также всё до 9-ой, там будет как раз рассказывать про то, что идет тема, а именно IR код и превращение кода в трехадресный вид, а именно 450 страница глава 6.2, но это не суть, если вы знаете, что такое лексер, то я думаю, что вы меня уже поняли, я эту информацию написал для того, чтобы вы меня смогли лучше понять, я не говорю, что вы чего-то не знаете, просто я привел аргументированные утверждения того, о чем идет тема.

Добавлено через 3 минуты
Всем спасибо за помощь и потраченное время! Вроде всё сделал, что связано с этим вопросом, кому интересно вот код того, что я сейчас пишу(https://pastebin.com/w3c27vHj), а именно лифтер кода до моего ML языка, а после буду готовить фазы оптимизации типа тех, что есть в LLVM, но только подходящих.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.02.2023, 19:01
Лучший ответ Сообщение было отмечено OSPFv3 как решение

Решение

Цитата Сообщение от OSPFv3 Посмотреть сообщение
Есть какой-нибудь std::find_next?
C++
1
2
3
4
5
auto find_result = vec.begin();
while ( (find_result = find(find_result, vec.end(), find_value)) != vec.end() ){
   // element found
   // do something
}
Цитата Сообщение от OSPFv3 Посмотреть сообщение
нужно находить все 4 штуки
В отсортированном массиве : lower_bound + upper_bound

Добавлено через 44 секунды
Цитата Сообщение от OSPFv3 Посмотреть сообщение
Всем спасибо за помощь и потраченное время! Вроде всё сделал, что связано с этим вопросом, кому интересно вот код того, что я сейчас пишу(https://pastebin.com/w3c27vHj), а именно лифтер кода до моего ML языка, а после буду готовить фазы оптимизации типа тех, что есть в LLVM, но только подходящих.
Звучит умно, удачи и вдохновения.
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 19:11  [ТС]
В отсортированном массиве : lower_bound + upper_bound
Спасибо!
C++
1
2
3
4
5
auto find_result = vec.begin();
while ( (find_result = find(find_result, vec.end(), find_value)) != vec.end() ){
   // element found
   // do something
}
Вас понял! Спасибо!
Звучит умно, удачи и вдохновения.
Вам тоже желаю удачи и вдохновения!
Удачного вечера!
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,104
15.02.2023, 19:14
Цитата Сообщение от OSPFv3 Посмотреть сообщение
я сделал через std::find, в моём случае это подойдет, но в других случаях не подойдет почему:
std::find и std::lower_bound возвращает первый элемент, который соответствует условию, а вдруг там таких элементов около 4 штук и нужно находить все 4 штуки и возвращать итератор на все 4 штуки? То, что делать в таком случае? Есть какой-нибудь std::find_next?
по порядку:
1) std::find (а также std::find_if, если нужен предикат) - ищет независимо от сортировки первый элемент. Ищет долго, поскольку не полагается на отсортированность
2) если последовательность отсортирована, то (1) тоже найдёт, но std::lower_bound справится намного быстрее (это бинарный поиск)
3) в случае использования std::find* - поиск очередного элемента нужно начинать с итератора it+1
4) в случае сортированного вектора эквивалентные элементы будут располагаться рядом. std::lower_bound найдёт позицию первого элемента, std::upper_bound - позицию за последним. Если элемента нет, то вернётся либо end() контейнера, либо итератор на другой ключ (стоящий после искомого, если бы искомый был). Как вариант, сначала можно найти lower, а затем шагать по +1, пока ключ нужный

Добавлено через 2 минуты
Цитата Сообщение от OSPFv3 Посмотреть сообщение
int i = std::distance(RegConstants.begin(), it);
опять непонятное телодвижение, ведь есть итератор. С ним можно и работать. Главное (впрочем, как и с индексом) - необходимо гарантировать невыход за край контейнера
2
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 19:22  [ТС]
опять непонятное телодвижение, ведь есть итератор. С ним можно и работать. Главное (впрочем, как и с индексом) - необходимо гарантировать невыход за край контейнера
https://ibb.co/qkrML9V
Хмм, в случае квадратных скобок, вроде перегруженность называется, т.е эта штука "[]" - мне не позволяет IntelliSense писать итератор в них, с чем это может быть связано?, хотя я могу писать итератор в случае с vector.insert...

по порядку:
1) std::find (а также std::find_if, если нужен предикат) - ищет независимо от сортировки первый элемент. Ищет долго, поскольку не полагается на отсортированность
2) если последовательность отсортирована, то (1) тоже найдёт, но std::lower_bound справится намного быстрее (это бинарный поиск)
3) в случае использования std::find* - поиск очередного элемента нужно начинать с итератора it+1
4) в случае сортированного вектора эквивалентные элементы будут располагаться рядом. std::lower_bound найдёт позицию первого элемента, std::upper_bound - позицию за последним. Если элемента нет, то вернётся либо end() контейнера, либо итератор на другой ключ (стоящий после искомого, если бы искомый был). Как вариант, сначала можно найти lower, а затем шагать по +1, пока ключ нужный
Спасибо за подробный рассказ, я заменил на std::lower_bound.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
15.02.2023, 19:27
Цитата Сообщение от OSPFv3 Посмотреть сообщение
В отсортированном массиве : lower_bound + upper_bound
std::equal_range
1
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,104
15.02.2023, 19:31
OSPFv3, итератор разыменовывается звёздочкой

*(it - FromRegToNameOfVarInRegConstants)
1
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
15.02.2023, 19:40  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
OSPFv3, итератор разыменовывается звёздочкой
*(it - FromRegToNameOfVarInRegConstants)
Хмм, в случае с
C++
1
RegConstants[*it - FromRegToNameOfVarInRegConstants]
начинает жаловаться на то, что итератор std::string, сам итератор в int не может перевестись...
Это же вообще не работает
C++
1
RegConstants*(it - FromRegToNameOfVarInRegConstants)
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,104
15.02.2023, 19:44
OSPFv3, но я же не так показывал.
Цитата Сообщение от OSPFv3 Посмотреть сообщение
RegConstants[*it - FromRegToNameOfVarInRegConstants]
А так:
Цитата Сообщение от Алексей1153 Посмотреть сообщение
*(it - FromRegToNameOfVarInRegConstants)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2023, 19:44
Помогаю со студенческими работами здесь

Сравнение введеной строки с строкой из файла
Добрый вечер.Пользователь вводит в консоль строку,если это строка уже имеется в файле (открыт заранее),то вывести сообщение.Иначе сохранить...

Сравнение строки со структуры со строкой, введённой пользователей
Есть структура persons, элементы которой заданы статически. Нужно сравнить один элемент структуры( строку char address ) со строкой,...

Описать функцию работы со строкой символов
Описать функцию работы сос строкой символов, которая проверит, начинается ли каждое слово с большой буквы.

Введите строкой набор символов без разделителей
3. Введите строкой набор символов без разделителей (пробел). Подсчитайте и выведите на консоль количество используемых символов и частоту...

Функция работы со строкой символов,заменить разделители
Нужно решить задачу: Написать функцию работы со строкой символов, которая заменит все разделители между словами символом табуляции.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru