【问题标题】:std::map checking both first and second value using compare parameterstd::map 使用比较参数检查第一个和第二个值
【发布时间】:2016-07-23 03:52:16
【问题描述】:

我有一个 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),以便正确显示菜单条目。 我使用 active 属性来确保如果有其他条目具有相同的 std::string(这是启动函数 entry.fptr 的命令),它们将不会具有相同的活动状态。

entry.active 属性的解释:

例如。想象两个不同的页面;用户面板和视图图像。这两个 有一个名为“下载”的命令,但是它们都有不同的 职能。一个下载用户日志,另一个下载一个 图片。 (这只是一个例子)。

我希望有一个比较函数来检查第一个参数是否匹配给定的输入,并且 entry.active 是否为真。

我想要完成的是类似于下面的代码。这不是功能代码,只是为了说明我希望 compare() 参数如何工作。检查输入是否与键相似,如果映射条目的 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() 会干净得多。

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

有什么建议吗? ^^,

解决方案

添加一个额外的地图持有者:

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

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

activeEntries.insert(i);

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

【问题讨论】:

  • this 之后的点不是 C++。 comp 是什么类的成员,它是如何被调用的?为什么你通过 const 值而不是引用传递 ab
  • 我不知道如何实现 comp() 函数,所以这并不是一个真正的建议,而是一种向你们展示我正在寻找的东西的方式。无论如何,出于我的好奇心,使用 this->entry.active 是否正确?
  • this-&gt; 可以完全省略,它仅用于消歧和different name lookup in derived class templates
  • 不确定您要做什么。
  • 看我写的代码示例。类似的东西。

标签: c++ c++11 struct stdmap


【解决方案1】:

您不能在std::map 中使用 value 部分进行比较功能,尽管这在技术上是可行的,因为 key 在 map 内时不得更改。因此,您要么必须保留多张地图,要么可以改用std::multimap,调用std::multimap::equal_range 并在该范围内搜索活动值。

注意,您可以将密钥更改为 std::pair&lt;std::string,bool&gt; 并在那里复制活动标志,但我认为这对您的情况没有帮助 - 要更改密钥,您必须删除您的条目并使用修改后的密钥重新插入它,这不会在这里很有意义。

可能更好和更清洁的解决方案是将std::shared_ptr 保留在不同地图中的条目取决于上下文,然后您不必复制条目并且您实际上不需要活动标志 - 只需添加到应该处于活动状态的地图.

【讨论】:

  • 如果我有密钥,我可以在 comp() 中执行 entries.at(key).active 吗?
  • @sciencefyll 地图中元素的顺序不能依赖于值部分——如果你改变了值,地图就会被破坏。
猜你喜欢
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多