std::使用compare参数映射检查第一个和第二个值
std::map checking both first and second value using compare parameter
我有一个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
保留到不同映射中的条目,这样就不必重复条目,而且实际上也不需要活动标志——只需将其添加到应该处于活动状态的映射中即可。
- 获取向量C++中第一个值和最后一个值的和
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 检查 IP 第一个八位字节是否不以 127 / 224 或 255 开头
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- 有没有办法接受某些输入的第一个字母并检查它是否在某个列表中?
- 尝试使用while循环从文件中读取数据.还必须检查以确保第一个和唯一的值不是-1
- 检查迭代仪上的第一个元素
- 如何检查向量的第一个元素是否<string>是引号C++
- GetEnvironmentVariable():这个函数是第一个用变量值检查nSize吗?
- 检查字符串中的第一个单词是否等于 "print"
- 检查该元素是std :: vector中的第一个还是最后一个
- std::使用compare参数映射检查第一个和第二个值
- 为什么我的代码只检查我的刽子手游戏(C ++)中单词的第一个字母
- LPCSTR-如何检查第一个位置是否为空格" "
- 如何提取并检查数组元素中的第一个字符是否为字母
- 检查文本框中的第一个字符
- 检查输入值的第一个字符,如果其中一个条件为假,则再次要求输入
- 如何使用 if 检查字符串数组的第一个元素第一个符号?
- C/C++-检查今天是否是本月的第一个星期一
- 检查在模板第一个参数之后声明的函数是否为 NULL(传递向量和数组)