gpt4 book ai didi

C++ 以不区分大小写的字母顺序打印 map

转载 作者:太空狗 更新时间:2023-10-29 20:25:44 28 4
gpt4 key购买 nike

我有一个:

map<string, map<int,int>>

有没有办法按字母顺序打印这张 map 的内容,但不区分大小写?例如,按以下顺序打印:

A : 1:1, 2:2
a : 3:1
an : 2:1
And : 4:1
and : 3:1

目前,我正在使用以下内容进行打印:

for (auto it = tokens.begin(); it != tokens.end(); ++it){
cout << it->first << " : ";
auto const &internal_map = it->second;
for (auto it2 = internal_map.begin(); it2 != internal_map.end(); ++it2){
if (it2 != internal_map.begin())
cout << " , ";
cout << it2->first << ":" << it2->second;
}
cout << endl;
}

这会打印所有内容,但是,它会先打印所有大写字母,然后再打印所有小写字母。例如:

A : 1:1, 2:2
And : 4:1
a : 3:1
an : 2:1
and : 3:1

最佳答案

如已接受的答案所述,您希望使用具有自定义比较功能的 map。诀窍是进行适当的比较。您不希望进行完全不区分大小写的比较,否则“And”和“and”将相等, map 中只允许其中一个。您的示例数据并未涵盖所有情况;例如“An”、“And”、“AN”、“AND”的顺序是什么?下面的比较函数将它们排序为“AN”、“An”、“AND”、“And” - 较短的字符串总是小于相同字符的较长字符串,并且第一个大小写不同的字符是与 upper 的决胜局-小写字母之前的大小写。

struct CaseAwareCompare
{
bool operator()(const char * left, const char * right) const
{
bool tied = true, tiebreaker = false;
for (int i = 0; left[i] != 0; ++i)
{
if (right[i] == 0)
return false;
if (tolower(left[i]) != tolower(right[i]))
return tolower(left[i]) < tolower(right[i]);
if (tied && left[i] != right[i])
{
tied = false;
tiebreaker = left[i] < right[i];
}
}
return (right[i] != 0) || (!tied && tiebreaker);
}

bool operator()(const string & left, const string & right) const
{
return operator()(left.c_str(), right.c_str());
}
};

我纠结于如何调用它;这不是不区分大小写的比较,因为它区分了不同大小写的输入。我最终决定将其称为区分大小写的比较。

关于C++ 以不区分大小写的字母顺序打印 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22902719/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com