【问题标题】:Get the key equal (if key exists in the map) or strictly less than given input in a map获取等于(如果映射中存在键)或严格小于映射中给定输入的键
【发布时间】:2017-01-04 02:31:39
【问题描述】:

我将numberOfItems 的键数作为输入并将它们放在这样的地图中:

int numberOfItems;
int query;
scanf("%d",&numberOfItems);
int temp;
map<int,int> iimap;
for(int i=0;i<numberOfItems;i++)
{
    scanf("%d",&temp);
    iimap.insert(make_pair(temp,1));
}
printf("Enter query: ");
scanf("%d",&query);
int VstrictlyLessOrEqual = FstrictlyLessOrEqual(query);

我为每个输入设置默认键 = 1;因此,不存在的键的值 =0。

6 100 5 4 3 2 1 50

对于这个输入(第一个输入 6 是 numberOfItems,最后一个输入 50 是 queryFstrictlyLessOrEqual() 应该返回值 5

【问题讨论】:

    标签: c++ stl stdmap


    【解决方案1】:

    你想使用std::mapupper_bound()lower_bound()方法:

    upper_bound()

    upper_bound() 将迭代器返回到高于搜索键的第一个键。所以:

    1. 致电upper_bound()

    2. 如果upper_bound()返回begin(),则表示搜索的低于地图中最低的键。

    3. 否则递减迭代器。它现在将指向一个与搜索的键相等的键,或者是下一个较小的键。

    lower_bound()

    lower_bound() 将迭代器返回到映射中等于或大于搜索到的键的第一个键,因此要实现您的目标,您需要:

    1. 致电lower_bound()

    2. 检查lower_bound() 是否没有返回end(),并且迭代器的键与您搜索的键相同。密钥存在于地图中。

    3. 否则,检查 lower_bound() 是否返回映射的 begin() 迭代器值。如果是这样,这意味着您搜索的键低于映射中的第一个键,因此存在这样的值。

    4. 否则,递减返回的迭代器。您搜索的键在映射中不存在,递减的迭代器指向映射中次小的键。

    【讨论】:

    • 如果我搜索地图中最大的键,upper_bound 会返回什么?
    • 它返回end()。现在,拿出纸和铅笔,按照我写下的upper_bound() 的逻辑流程图,看看会发生什么。
    【解决方案2】:

    如果键的默认顺序 (std::less) 不是必需的,那么使用 std::greater 作为 key_compare 和单个 lower_bound() 调用就可以解决问题。

    // std::greater instead of default std::less
    std::map<int, int, std::greater<int>> m = {{3, 0}, {5, 0}, {7, 0}, {9, 0}};
    
    auto it = m.lower_bound(1);
    printf("%d\n", it != m.end() ? it->first : -1); // prints -1
    it = m.lower_bound(3);
    printf("%d\n", it != m.end() ? it->first : -1); // prints 3
    it = m.lower_bound(4);
    printf("%d\n", it != m.end() ? it->first : -1); // also prints 3
    

    【讨论】:

      【解决方案3】:

      返回一个迭代器,指向键为 key 的最后一个元素。如果没有找到这样的元素,则返回过去的迭代器。

      template <typename C>
      typename C::const_iterator
      find_key_less(const C& c, const typename C::key_type& key)
      {
          auto iter = c.lower_bound(key);
          if (iter == c.cbegin())
              return c.cend();
          return --iter;
      }
      

      将迭代器返回到键为 key 的最后一个元素。如果没有找到这样的元素,则返回过去的迭代器。

      template <typename C>
      typename C::const_iterator
      find_key_less_equal(const C& c, const typename C::key_type& key)
      {
          auto iter = c.upper_bound(key);
          if (iter == c.cbegin())
              return c.cend();
          return --iter;
      }
      

      find_key_greater_equal == lower_bound

      find_key_greater == upper_bound

      【讨论】:

        猜你喜欢
        • 2010-10-06
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 2021-05-01
        • 1970-01-01
        相关资源
        最近更新 更多