C++ 在多重贴图中为一个关键点查找两个最大值

C++ 在多重贴图中为一个关键点查找两个最大值,c++,key,multimap,std-pair,C++,Key,Multimap,Std Pair,我有一个多重映射,由一个键组成,它是一对整数,键的值是浮点数。 现在,我希望所有键都有两个最大值。 在我的示例中,键(1,1)应产生值5.8和3.7。 键(2,2)应产生2.4和1.5。 指出:我不知道钥匙的号码和外观。所以我不知道键(2,2)是否存在 代码如下: int main(int argc, char** argv) { // Create some values - both vectors have the same size // The pairs and th

我有一个多重映射,由一个键组成,它是一对整数,键的值是浮点数。 现在,我希望所有键都有两个最大值。
在我的示例中,键(1,1)应产生值5.8和3.7。
键(2,2)应产生2.4和1.5。
指出:我不知道钥匙的号码和外观。所以我不知道键(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]));
    }

}
int main(int argc,char**argv)
{
//创建一些值-两个向量的大小相同
//这些对和θ可能是未排序的
向量对;
配对。推回(使配对(1,1));
配对。推回(使配对(1,1));
配对。推回(使配对(1,1));
配对。推回(使配对(2,2));
配对。推回(使配对(2,2));
配对。推回(使配对(3,3));
配对。推回(使配对(3,3));
配对。推回(使配对(1,1));
向量θ;
θ.推回(1.4);
θ.推回(2.4);
θ.推回(3.7);
θ.推回(2.4);
θ推回(1.5);
θ.推回(1.6);
θ.推回(2.4);
θ.推回(5.8);
多地图相似性;
对于(size_t i=0;i
在我的特定情况下,我不知道在多重映射中定义了哪些密钥对。 我还认为也许multimap不是正确的选择,但我不确定哪种类型更好。

我试图保持θ的矢量格式,但是很难跟踪相关的对。

我希望我的回答是正确的:

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;
auto-range=相似性。相等的_-range(生成_对(1,1));
找到的大小=0;浮动最高,第二高;
if(range.first!=相似性.end()&&range.first!=range.second){
++发现;
最高=(*std::max_元素(range.first++,range.second)).second;
if(range.first!=range.second){
++发现;
第二高=
(*std::max_元素(range.first++,range.second,[&](auto a,auto b){返回a.second0)

std::cout我希望我正确地理解了你:

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;
auto-range=相似性。相等的_-range(生成_对(1,1));
找到的大小=0;浮动最高,第二高;
if(range.first!=相似性.end()&&range.first!=range.second){
++发现;
最高=(*std::max_元素(range.first++,range.second)).second;
if(range.first!=range.second){
++发现;
第二高=
(*std::max_元素(range.first++,range.second,[&](auto a,auto b){返回a.second0)

std::cout这里有几个选项

  • 保留现有的
    multimap
    ,只需对值进行线性搜索即可找到两个最大的值
  • 改为使用
    map
    ,然后在查找密钥后,可以立即访问前两项
  • 使用
    map
    并在插入时保持向量排序。查找比插入更多时效果更好
  • 当需要检索最高的两个值时,使用
    map
    partial_sort
    前两项。插入比查找更多时效果更好

    • 您在这里有一些选择

      • 保留现有的
        multimap
        ,只需对值进行线性搜索即可找到两个最大的值
      • 改为使用
        map
        ,然后在查找密钥后,可以立即访问前两项
      • 使用
        map
        并在插入时保持向量排序。查找比插入更多时效果更好
      • 当需要检索最高的两个值时,使用
        map
        partial_sort
        前两项。插入比查找更多时效果更好

      这就是我的意思,但如果我不知道钥匙怎么办?键1,1可能存在,但键2,1不存在。所以我不能使用
equal_range
对吗?这就是为什么我把工作放进去,让它这样做的原因。使用不存在的密钥尝试代码。为什么你认为我在第二个
max_元素
中加入检查和找到的变量以及专门的谓词?如果你愿意接受答案,那就太好了?那太棒了。留点时间来享受你的烧烤吧。你可能需要根据自己的需要调整谓词。这就是我的意思,但是如果我不知道键,我该怎么办?键1,1可能存在,但键2,1不存在。所以我不能使用
equal_range对吗?这就是为什么我把工作放进去,让它这样做的原因。使用不存在的密钥尝试代码。为什么你认为我在第二个
max_元素
中加入检查和找到的变量以及专门的谓词?如果你愿意接受答案,那就太好了?那太棒了。留点时间来享受你的烧烤吧。您可能需要根据需要调整谓词。