gpt4 book ai didi

c++ - 在 C++ 中按非 ascii 顺序的第一个字母对字符串 vector 进行排序

转载 作者:行者123 更新时间:2023-11-30 01:42:12 25 4
gpt4 key购买 nike

我有一个包含单词列表的文本文件。

我使用 ifstream 将这些单词读入一个 vector 中,现在我试图按照类似于以下的顺序对它们进行排序:

A a B b C c [...]

我尝试在气泡搜索算法中使用第三个 for 循环来实现此目的,以查看每个单词的第一个字符(我知道这远非最有效的方法,尤其是当我使用大型数据集时)

然后检查字母和下一个字母是大写还是小写,如果大写字母与当前字母相同则切换,但这似乎不起作用。

void bubble_Sort (vector <string> & words)
{
for (unsigned i = words.size(); i >= 2; --i)
{
for (unsigned k = 0; k + 1 < i; k++)
{
int hi = k+1;
string temp1 = words[hi];
string temp2 = words[k];
int smallsize = words[hi].size();
int smallprecedence = 0;

if (words[k].size() < words[hi].size())
smallsize = words[k].size();

for (unsigned j = 0; j < smallsize; j++)
{
if (temp1[j] >= 'A' && temp1[j] <= 'Z')
{
if (temp2[j] >='a' && temp2[j] <= 'z')
{
char lowercase1 = temp1[j] + 32;
if (lowercase1 == temp2[j])
{
string temp = words[k];
words[k] = words[hi];
words[hi] = temp;
break;
}
}

else if (temp2[j] >= 'A' && temp2[j] <= 'Z')
{
if (temp1[j] < temp2[j])
{
string temp = words[k];
words[k] = words[hi];
words[hi] = temp;
break;
}
}
}

if (temp1[j] >= 'a' && temp1[j] <= 'z')
{
if (temp2[j] >= 'A' && temp2[j] <= 'Z')
{
char uppercase1 = temp1[j] - 32;
if (uppercase1 < temp2[j])
{
string temp = words[k];
words[k] = words[hi];
words[hi] = temp;
break;
}
}

else if (temp2[j] >= 'a' && temp2[j] <= 'z')
{
if (temp1[j] < temp2[j])
{
string temp = words[k];
words[k] = words[hi];
words[hi] = temp;
break;
}
}
}

else if (temp1[j] == temp2[j] && temp1.size() < temp2.size())
++smallprecedence;
}

if (smallprecedence == smallsize)
{
string temporary = words[k];
words[k] = words[hi];
words[hi] = temporary;
}
}
}
}

最佳答案

不要重新发明轮子。只需修改默认比较函数,使 aA < bB(不考虑大小写)和 A < a。

编辑我使用了错误的比较函数。它应该返回 true对于 < , 和 false对于 >= .已修复

std::vector<std::string> vec;
//
std::sort(vec.begin(), vec.end(), [](const std::string& lhs, const std::string& rhs)
{
const char* s1=lhs.c_str();
const char* s2=rhs.c_str();
while(true) {
// first ignore case
if ( std::toupper(*s1) < std::toupper(*s2) ) return true;
if ( std::toupper(*s1) > std::toupper(*s2) ) return false;
// end of both strings, exact match
if ( *s1 == 0 && *s2 == 0 ) return false;
// compare upper case vs lower case ('A' vs 'a')
if ( *s1 > *s2) return false;
if ( *s1 < *s2) return true;
++s1; ++s2;
}
});

关于c++ - 在 C++ 中按非 ascii 顺序的第一个字母对字符串 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39971585/

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