【问题标题】:Is it possible to use custom find function in multimap?是否可以在多地图中使用自定义查找功能?
【发布时间】:2014-06-11 07:43:36
【问题描述】:

我有一个应用程序在 C++ 中使用来自 STL 的 multimap

multimap 中,我必须将find 函数与我的自定义函数一起使用。即假设,我的多图的内容是{"Hello", "World"}, "{"Bye", "World"} and {"Foo", "Bar"}

我想搜索本身包含“e”的键,即它应该只返回“Hello”和“Bye”。

我该怎么做?

基本上,我想定义自己的自定义相等,而不是已经定义的检查绝对相等的 find 函数?

【问题讨论】:

  • stackoverflow.com/questions/5733254/…(multimap完全一样)
  • 但请注意,使用比较器会改变数据在多重映射中的存储方式:其中许多不是 OP 想要的。 (也许“e”是一个具体的例子)。
  • @Bathsheba 自定义函数将在(多)地图的整个生命周期中使用。没有办法使用不同的自定义函数,例如对find 的不同调用。
  • @n.m.我想要搜索中的自定义功能,即查找操作不在存储操作中
  • ...这是这个问题的症结所在。不,您不能为查找操作使用不同的比较器。

标签: c++ stl multimap


【解决方案1】:

c++ 中的映射(和多映射)是针对按键搜索进行了优化的数据结构。但是,搜索是使用声明地图时使用的比较运算符执行的。如果您需要使用不同的比较(在这种情况下是键中包含的字母)执行任何搜索,您将无法利用 find 操作的良好性能。您唯一的选择是执行线性搜索。另一种选择是使用不同的(自定义)比较运算符声明地图。

【讨论】:

    【解决方案2】:

    可以完成您要查找的内容,但不能使用 multimap::findmultimap(或 map)仅使用您为键排序提供的相同比较器执行查找,并且不能仅对 (multi)map::find 使用不同的比较器。

    但是,您可以使用copy_if 将您想要的键值对复制到不同的容器中。

    std::multimap<std::string, std::string> m{{"Hello", "World"}, 
                                              {"Bye", "World"}, 
                                              {"Foo", "Bar"}};
    std::vector<decltype(m)::value_type> vec;
    
    std::copy_if(m.begin(), m.end(), std::back_inserter(vec),
        [](decltype(m)::value_type const& kv) {
            return std::any_of(kv.first.begin(), kv.first.end(), 
                               [](decltype(*kv.first.begin()) c) {return c == 'e';});
        });
    

    vec 将包含您感兴趣的键值对。

    Live demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2012-07-05
      • 2017-07-31
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 2020-03-22
      相关资源
      最近更新 更多