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

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

提问人:Jayesh 提问时间:9/18/2021 最后编辑:JeJoJayesh 更新时间:9/18/2021 访问量:129

问:

我曾面试过一家跨国公司。他给了我以下代码,并要求我使函数区分大小写。我试过了,但无法理解如何使内置查找功能区分大小写。有没有办法使仅查找特定键值区分大小写?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
C++ 11 查找 stdmap c++-standard-library

评论

5赞 SergeyA 9/18/2021
这个问题没有意义。“查找”已区分大小写,它只能在地图上查找一个元素。您可以使用 find 返回的迭代器进行迭代,并且基本上遍历所有地图 - 但这并不意味着 find 不区分大小写。尝试替换地图元素,而不是以 开头的任何元素 - 您将看到相同的结果。TESTZ
1赞 WhozCraig 9/18/2021
简短版本:无需枚举从标准容器中获取的每个迭代器。如果你想要的东西被发现,迭代器会引用它;如果未找到,则迭代器将为 。真的就是这么简单。我不知道你为什么要使用枚举循环,以及地球上是什么力量告诉你这样做,但无论它是什么,它都是错误的。mp.end()

答:

6赞 JeJo 9/18/2021 #1

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

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

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

1赞 Jerry Coffin 9/18/2021 #2

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

碰巧的是,在大多数常见的字符集中,大写字母在小写字母之前排序,因此将成为 中的第一项。因此,当您从那里打印出来时,您最终会打印出所有项目。TESTmap

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

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