std::使用compare参数映射检查第一个和第二个值

std::map checking both first and second value using compare parameter

本文关键字:第一个 检查 第二个 映射 使用 compare 参数 std      更新时间:2023-10-16

我有一个std::map变量,它包含一个std::字符串作为第一个参数,一个struct作为第二个参数。

struct entry {
    std::string state;       // works like an url eg. "/login" shows login
    std::string description; // menu entry description eg. "login here"
    int minAuth;             // maximum user authorization level
    int maxAuth;             // minimum user authorization level
    void (*fptr)();          //function to be called on match
    bool active = false;     // true if this is one of the options displayed 
};
std::map<std::string, entry> entries;

我需要检查的是第一个参数值和第二个值(entry.active),以便正确显示菜单项。我使用一个active属性来确保如果有其他条目具有相同的std::string(这是启动函数entry.fptr的命令),它们将不会具有相同的活动状态。

entry.active属性的说明:

例如。想象两个不同的页面;usersPanel和viewImage。这两者有一个名为"下载"的命令,但它们都有不同功能。一个下载用户日志,另一个下载形象(这只是一个例子)。

我更希望有一个比较函数来检查第一个参数是否与给定的输入匹配,以及entry.active是否为true。

我正在努力实现的是下面的代码。这不是一个函数代码,它只是为了澄清我希望compare()参数如何工作。检查输入是否与键相似,以及映射条目的值.active是否为true,我希望comp()返回true。

bool comp (const std::string a, const std::string b) const
{
    return (a == b && this.second.active);
}

同样,一些人抱怨这段代码,所以让我这样说:那是伪代码,而不是真正的代码。

我的第二种处理方法是为所有当前活动的菜单项创建一个临时std::map,但我希望不需要添加额外的std::map列表。comp()会干净得多。

粘贴代码:http://pastebin.com/1uj40Fw8

有什么建议吗?^^,

解决方案

增加一个额外的地图支架:

std::map<std::string, entry> entries, activeEntries;

程序规则批准要显示的地图条目后,将其添加到activeEntries地图:

activeEntries.insert(i);

然后使用activeEntries映射上的std::map::find在整个菜单中找到正确的用户选择。对于较大的菜单也更有效。

您不能在std::map中使用值部分作为比较函数,尽管这在技术上是可能的,因为键在映射中时不能更改。因此,您要么必须保留多个映射,要么可以使用std::multimap,调用std::multimap::equal_range并搜索该范围内的活动值。

请注意,您可以将密钥更改为std::pair<std::string,bool>并在那里复制活动标志,但我认为这对您的情况没有帮助——要更改密钥,您必须删除条目并用修改后的密钥重新插入,这在这里没有多大意义。

可能更好、更干净的解决方案是根据上下文将std::shared_ptr保留到不同映射中的条目,这样就不必重复条目,而且实际上也不需要活动标志——只需将其添加到应该处于活动状态的映射中即可。