【问题标题】:How to get the key of a map using the value in C++ STL如何使用 C++ STL 中的值获取地图的键
【发布时间】:2021-05-26 15:18:34
【问题描述】:

通过在 C++ STL 中输入该键的值来获取键

 map<int,int> m;
   m[0]=8;
   m[8]=7;
   m[1562]=4;
   m[100]=1;
 auto i=m.find(1562);
    cout<<endl<<i->first;

【问题讨论】:

  • 您实际上是在寻找您在代码的 l.4 中创建的密钥,并在 l.6 中使用 find 命令。您的文字描述说您要查找 VALUE 的相应键?见:stackoverflow.com/questions/12742472/…
  • 地图用于查找给定键的值。如果你想做相反的事情,你需要自己实现它(即循环所有元素并尝试找到值)或使用不同的容器
  • 这能回答你的问题吗? Find mapped value of map

标签: c++ dictionary search stl key-value


【解决方案1】:

你不能。该映射通过散列键然后使用它来查找存储在内存中的值来工作。它不允许您使用值来索引键。

您可以做的是,遍历映射以查找值并从中获取键。

int key = 0;
int value = 4;
for(auto entry : m)
{
    if(entry.second == value)
    {
        key = entry.first;
        break;    // Exit from the loop.
    }
}

参考:cppreference

【讨论】:

  • 也许值得注意的是,这个解决方案(我认为也是 OP 的问题)假设该值在地图中只出现一次(或者应该只出现一次)。通常情况并非如此,对于一个值,可以找到多个键
【解决方案2】:

std::map 是一个按键排序的容器。因此,要按值查找键,您需要使用顺序搜索。例如,您可以使用标准算法std::find_if

这是一个演示程序。

#include <iostream>
#include <map>
#include <iterator>
#include <algorithm>

int main() 
{
    std::map<int,int> m =
    {
        { 0, 8 }, { 8, 7 }, { 1562, 4 }, { 100, 1 }
    };
   
    int value = 4;
    
    auto it = std::find_if( std::begin( m ), std::end( m ),
              [&value]( const auto &p )
              {
                return p.second == value; 
              } );
              
    if ( it != std::end( m ) ) 
    {
        std::cout << it->first << ' ' << it->second << '\n';
    }
    
    return 0;
}

程序输出是

1562 4

或者您应该使用允许通过键和值快速访问容器元素的非标准容器。

【讨论】:

    【解决方案3】:

    你也可以这样做:

    #include<iostream>
    #include <map>
    
    int findByValue(std::map<int, int> mapOfElemen, int value)
    {
    
        std::map<int, int>::iterator it = mapOfElemen.begin();
        // Iterate through the map
        while(it != mapOfElemen.end())
        {
            // Check if value of this entry matches with given value
            if(it->second == value)
            {
                return it->first;
            }
            // Go to next entry in map
            it++;
        }
       //key for the value is not found hou probably need to change this depending on your key space
        return -9999;
    }
    
    int main()
    {
    std::map<int,int> m;
       m[0]=8;
       m[8]=7;
       m[1562]=4;
       m[100]=1;
    
       int value = 1562;
       int result = findByValue( m, value);
       std::cout << "key for "<< value << " is " << result << std::endl;
    
       value = 8;
       result = findByValue( m, value);
       std::cout << "key for "<< value << " is " << result << std::endl;
    
       value = 7;
       result = findByValue( m, value);
       std::cout << "key for "<< value << " is " << result << std::endl;
    }
    

    结果是这样的:

    key for 1562 is -9999 
    key for 8 is 0
    key for 7 is 8
    key for 4 is 1562
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2014-06-11
      • 2017-09-23
      相关资源
      最近更新 更多