Фильтр C ImGui с использованием вектора

#c #vector #filter

#c #вектор #Фильтр

Вопрос:

Эй, так что в настоящее время я читаю имена всех файлов .txt в папке и добавляю их в « vectorlt;stringgt; TxtFiles «.

Я хочу, чтобы эти имена файлов отображались внутри фильтра, чтобы вы могли искать имя файла.

Вот пример для фильтра в ImGui:

 static ImGuiTextFilter filter; filter.Draw(); const char* Filterlist[] = {  "1: Word1",  "2: Word2",  "3: Word3",  "4: Word4",  "5: Word5", };  for (int i = 0; i lt; IM_ARRAYSIZE(Filterlist); i  )  if (filter.PassFilter(Filterlist[i]))  ImGui::Text("%s", Filterlist[i]);  

Это очень хорошо работает с использованием «const char*» и предопределенного списка. Но поскольку я читаю имена файлов во время выполнения и не хочу предопределять их, я использую « vectorlt;stringgt; TxtList » для « TxtList.push_back(TxtFileName); »

Я попытался просто изменить код выше на этот:

 static ImGuiTextFilter filter; filter.Draw(); for (int i = 0; i lt; IM_ARRAYSIZE(TxtList); i  )  if (filter.PassFilter(TxtList[i]))  ImGui::Text("%s", TxtList[i]);  

Но для «IM_ARRAYSIZE» это дает мне следующее сообщение об ошибке:

«ни один оператор» * » не соответствует этим операндам, типы операндов: * std::векторlt;std::строка, std::распределительstd::строкаgt;»

Также «TxtList[i]» за «фильтром.Фильтр доступа(..» выдает мне ошибку:

не существует подходящей функции преобразования из «std::string» в «const char»

Как мне изменить код здесь, чтобы фильтр работал с векторным списком TXT?

Ответ №1:

Ну, я не знаю, что IM_ARRAYSIZE содержит макросы, но , вероятно, это что-то вроде этого: sizeof(array) / sizeof(*array) , но поскольку вы переключились на векторы, вы можете использовать vector.size() .

Чтобы исправить вторую проблему, вам , вероятно, нужно добавить .c_str() после TxtList[i] , чтобы преобразовать std::string в const char*

Комментарии:

1. IM_ARRAYSIZE взят из официального репозитория imgui в imgui.h и выглядит так: «#определите IM_ARRAYSIZE(_ARR) ((int)(размер(_ARR) / размер(*_ARR))) / / Размер статического массива в стиле C. Не используйте указатели!»

2. Хорошо, спасибо, поэтому TxtList.size(); исправлена первая ошибка, спасибо. Ты знаешь, как я мог бы починить вторую?

3. Да, «.size()», а не «.length()», «.length()» для строк, извините за это.

4. .c_str() также исправил вторую проблему, большое спасибо