如何使 std::map::find 函数区分大小写?

How to make std::map::find function case sensitive?

我面试过一家跨国公司。他给了我下面的代码,并让我让 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

问题是 for 循环。您无需遍历地图即可打印它。相反你需要做

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

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

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

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

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

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