我有一个std :: map变量,它包含一个std :: string作为它的第一个参数,一个结构包含它的第二个参数。
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),以便正确显示菜单条目。 我正在使用一个活动属性来确保如果有其他条目具有相同的std :: string(这是启动函数entry.fptr的命令),它们将不具有相同的活动状态。
对entry.active属性的补充:
例如。想象两个不同的页面; usersPanel和viewImage。这两个 有一个名为“下载”的命令,但它们都有不同 功能。一个下载用户日志,另一个下载一个 图片。 (这只是一个例子)。
我希望有一个比较函数来检查第一个参数是否与给定的输入匹配,并且entry.active是真的。
我想要完成的是类似下面的代码。这不是一个功能代码,它只是为了清楚我希望compare()参数如何工作。检查输入是否与键类似,如果map条目的value.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()会更清晰。
Pastebin代码:http://pastebin.com/1uj40Fw8
有什么建议吗? ^^,
解
添加额外的地图持有人:
std::map<std::string, entry> entries, activeEntries;
在要显示的程序规则批准地图条目后,将其添加到activeEntries地图:
activeEntries.insert(i);
然后在activeEntries地图上使用std :: map :: find在整个菜单中找到正确的用户选择。对于更大的菜单也更有效。
答案 0 :(得分:1)
虽然技术上可行,但您不能在std::map
中使用值部分作为比较功能,因为当它在地图内时不能更改密钥。因此,您必须保留多个地图,或者您可以使用std::multimap
代替,请致电std::multimap::equal_range
并在该范围内搜索有效值。
注意,您可以将密钥更改为std::pair<std::string,bool>
并在那里复制活动标记,但我认为这不会对您的情况有所帮助 - 要更改密钥,您必须删除条目并使用修改后的密钥重新插入在这里没有多大意义。
可能更好更清洁的解决方案是将std::shared_ptr
保留在不同地图中的条目取决于上下文,然后您不必重复条目,并且您实际上不需要活动标记 - 只需添加到地图中它应该活跃。