【问题标题】:C++ ImGui Filter using vector<string>C++ ImGui 过滤器使用向量<string>
【发布时间】:2022-01-10 23:32:53
【问题描述】:

嘿,所以我目前正在读取文件夹中所有 .txt 文件的文件名,并将它们添加到“vector&lt;string&gt; 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 < IM_ARRAYSIZE(Filterlist); i++)
    if (filter.PassFilter(Filterlist[i]))
        ImGui::Text("%s", Filterlist[i]);

使用“const char*”和一个预定义的列表非常有效。 但是当我在运行时读取文件名并且不想预定义它们时,我使用“vector&lt;string&gt; TxtList”到“TxtList.push_back(TxtFileName);

我试着把上面的代码改成这样:

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

但对于“IM_ARRAYSIZE”,它给了我以下错误消息:

"没有运算符'*'匹配这些操作数,操作数类型有:* std::vector<:string std::allocatorsstd::string>"

“filter.PassFilter(..”后面的“TxtList[i]”也会给我一个错误:

不存在从“std::string”到“const char”的合适转换函数

如何更改此处的代码以使过滤器与向量 TxtList 一起使用?

【问题讨论】:

    标签: c++ vector filter


    【解决方案1】:

    好吧,我不知道,宏 IM_ARRAYSIZE 包含什么,但它可能是这样的:sizeof(array) / sizeof(*array),但是当你切换到向量时,你可以使用 vector.size()

    为了解决第二个问题,您可能需要在TxtList[i] 之后添加.c_str(),以便将std::string 转换为const char*

    【讨论】:

    • IM_ARRAYSIZE 来自 imgui.h 中的官方 imgui repo,它是:“#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*_ARR))) // 大小静态 C 样式数组。不要在指针上使用!"
    • 好的,谢谢,TxtList.size();修复了第一个错误谢谢。你知道我该如何解决第二个问题吗?
    • 是的,".size()",而不是 ".length()",".length()" 用于字符串,抱歉。
    • .c_str() 也修复了第二个问题,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多