【问题标题】:Find two biggest values for one key in a multimap在多图中找到一个键的两个最大值
【发布时间】:2018-04-24 14:15:25
【问题描述】:

我有一个由一对整数组成的键组成的多重映射,键的值是浮点数。 现在我想为我的所有键设置 2 个最大值。
在我的示例中,键 (1, 1) 应产生值 5.8 和 3.7。
键 (2, 2) 应该导致 2.4 和 1.5。
指出:我不知道我的键的数量和外观。所以我不知道 key (2, 2) 是否存在。

代码如下:

int main(int argc, char** argv)
{
    // Create some values - both vectors have the same size
    // The pairs and the thetas may be unsorted
    vector<pair<int, int>> pairs;
    pairs.push_back(make_pair(1, 1));
    pairs.push_back(make_pair(1, 1));
    pairs.push_back(make_pair(1, 1));
    pairs.push_back(make_pair(2, 2));
    pairs.push_back(make_pair(2, 2));
    pairs.push_back(make_pair(3, 3));
    pairs.push_back(make_pair(3, 3));
    pairs.push_back(make_pair(1, 1));

    vector<float> theta;
    theta.push_back(1.4);
    theta.push_back(2.4);
    theta.push_back(3.7);
    theta.push_back(2.4);
    theta.push_back(1.5);
    theta.push_back(1.6);
    theta.push_back(2.4);
    theta.push_back(5.8);

    multimap<pair<int, int>, float> similarities;

    for (size_t i = 0; i < pairs.size(); i++) {
        similarities.insert(make_pair(make_pair(pairs[i].first, pairs[i].second), theta[i]));
    }

}

在我的具体情况下,我不知道我的多重映射中定义了哪些密钥对。 我还认为 multimap 可能不是正确的选择,但我不确定什么是更好的类型。
我试图保持 theta 的矢量格式,但很难跟踪相关的对。

【问题讨论】:

    标签: c++ key multimap std-pair


    【解决方案1】:

    我希望我没听错:

    auto range = similarities.equal_range(make_pair(1,1));
    
    size_t found = 0; float highest, second_highest;
    
    if (range.first != similarities.end() && range.first != range.second) {
      ++found;
      highest = (*std::max_element(range.first++, range.second)).second;
      if (range.first != range.second) {
        ++found;
        second_highest =
          (*std::max_element(range.first++, range.second, [&](auto a, auto b){ return a.second < b.second && b.second < highest; })).second;
      }
    }
    
    if (found > 0)
      std::cout << highest<< std::endl;
    if (found > 1)
      std::cout << second_highest << std::endl;
    

    以上内容不会两次给您相同的值。

    【讨论】:

    • 这就是我的意思,但如果我不知道钥匙怎么办?键 1,1 可能存在,但键 2, 1 不存在。所以我不能使用equal_range 对吗?
    • 这就是我投入工作的原因。使用不存在的密钥尝试代码。你为什么认为我在第二个max_element 中加入了检查、找到的变量和专门的谓词?
    • 如果你能接受这个答案会很好吗?那太棒了。
    • 留出一些时间来享受您的 Grillteller。您可能需要根据需要调整谓词。
    【解决方案2】:

    这里有几个选项。

    • 保留现有的multimap,然后对这些值进行线性搜索以找到最大的两个。
    • 改用map&lt;pair&lt;int, int&gt;, set&lt;float, std::greater&lt;float&gt; &gt; &gt;,然后在查找密钥后立即访问前两项。
    • 使用map&lt;pair&lt;int, int&gt;, vector&lt;float&gt; &gt; 并保持向量在插入时排序。进行更多查找而不是插入时效果更好。
    • 当需要检索最高的两个值时,使用map&lt;pair&lt;int, int&gt;, vector&lt;float&gt; &gt;partial_sort 前两项。插入比查找更多时效果更好。

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 2022-11-21
      • 2020-09-19
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2013-10-14
      • 2022-11-04
      相关资源
      最近更新 更多