如何使 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 范围内的所有项目。
我面试过一家跨国公司。他给了我下面的代码,并让我让 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 范围内的所有项目。