【问题标题】:How to make std::map::find function case sensitive?如何使 std::map::find 函数区分大小写?
【发布时间】:2021-11-12 15:35:54
【问题描述】:

我曾采访过一家跨国公司。他给了我以下代码,并要求我将find() 函数设为区分大小写。我试过了,但不明白如何使内置的查找功能区分大小写。有什么方法可以区分大小写以仅查找特定的键值?

#include <iostream>
#include <map>
using namespace std;

int main()
{
    map<string, int> mp;
    mp["Test"] = 1;
    mp["test"] = 2;
    mp["TEST"] = 3;
    mp["tesT"] = 4;    

    for (auto it = mp.find("TEST"); it != mp.end(); it++)
    {
        cout << it->first << " " << it->second << endl;
    }

    return 0;
}

输出:

TEST 3
Test 1
tesT 4
test 2

但我希望输出是:

TEST 3

【问题讨论】:

  • 这个问题毫无意义。 Find 已经区分大小写,它只在地图上找到一个元素。您使用 find 返回的迭代器进行迭代,本质上,迭代您的所有地图 - 但这并不意味着 find 不区分大小写。尝试将除TEST 以外的地图元素替换为以Z 开头的任何内容 - 您将看到相同的结果。
  • 短版:您不需要枚举从标准容器中获得的每个迭代器。如果你想要的东西被发现了,迭代器就会引用它;如果没有找到,迭代器将是mp.end()。真的就是这么简单。我不知道你为什么要使用枚举循环,以及地球上的什么力量告诉你这样做,但无论它是什么,它都是错误的。

标签: c++ c++11 find stdmap c++-standard-library


【解决方案1】:

问题在于 for 循环。您无需遍历地图即可打印它。而是你需要做的

auto it = mp.find("TEST");
if (it != mp.end())
    std::cout << it->first << " " << it->second << std::endl;

std::map::find 将找到一个迭代器,该迭代器指向键值对,该键值对的键正好为 "TEST",如果没有找到,则只找到结束迭代器。

【讨论】:

    【解决方案2】:

    这里发生的事情是它正在寻找“TEST”,然后您将遍历地图的其余部分,并打印出之后的所有内容。

    碰巧的是,在最常见的字符集中,大写字母排在小写字母之前,因此TEST 将成为map 中的第一项。因此,当您从那里开始打印内容时,您最终会打印出所有项目。

    但是map 只能保存一个具有特定键的项目,因此没有真正的理由进行迭代。您要么找到了一项 (it != container.end()),要么没有找到 (it == container.end())。

    如果您使用的是multimap,则可能有多个项目具有相同的密钥。在这种情况下,您通常希望使用std::equal_range 来查找具有该键的所有项目。这将返回一对迭代器,一个到范围的开头,另一个在具有该键的项目范围的结尾之后。然后,您将打印出它返回的范围内的所有项目。

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 2013-10-06
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多