gpt4 book ai didi

C++ 排序 - 普通字母后的特殊字符

转载 作者:行者123 更新时间:2023-11-30 00:49:06 29 4
gpt4 key购买 nike

我有一个字符串 vector ,它包含类似

的字符串
BB
aA
12
b
AA
&
[
**
1

在 C++ 中使用默认的 sort() 我得到了这个排序列表

&
**
1
12
AA
BB
[
aA
b

取而代之的是,我需要用普通字母 A, a, B, b.... 排在前面,然后是“特殊”字符,如 0 -9, *, [, , ~, !.... 按照正常的 ASCII 顺序。

我真的不知道如何改变 vector 的排序方式以确保它全部按该顺序排列。谢谢。

最佳答案

另一个未经测试的解决方案。

如果我遗漏了一个案例,我相信有人会指出来,但这里是:

#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
#include <vector>
#include <iterator>

using namespace std;

int main() {
std::vector <std::string> StringVect = { "BB", "aA", "12", "b", "AA", "&", "[", "**", "1" };

std::sort(StringVect.begin(), StringVect.end(), []
(const std::string& s1, const std::string& s2)
{
if (s1.empty() || s2.empty())
return s1 < s2;

// a convenience array
bool ac[] = { isalpha(s1[0]), isalpha(s2[0]),
isdigit(s1[0]), isdigit(s2[0]),
!isalnum(s1[0]), !isalnum(s2[0]) };

// If both strings start with the same type, then return
// s1 < s2
if ((ac[0] && ac[1]) || // if both alpha strings
(ac[2] && ac[3]) || // if both digit strings
(ac[4] && ac[5])) // if both non-alphanumeric strings
return s1 < s2;

// if first string is alpha, or second string is not alphanumeric
// the strings are in order, else they are not
return (ac[0] || ac[5]);
});
copy(StringVect.begin(), StringVect.end(), ostream_iterator<string>(cout, "\n"));
}

基本上,条件是这样说的:

1) 如果其中一个字符串为空,则返回 s1 < s2

2) 如果两个字符串都以相同的字符类型开头,则返回 s1 < s2

3) 如果第一个字符串以字母开头,或者如果第二个字符串不是字母数字,则字符串按顺序排列并返回 true,否则返回 false。这里的诀窍是意识到步骤 2) 消除了两个字符串的所有组合是同一类型,因此我们在步骤 3) 阶段的检查变得简化。

实例:http://ideone.com/jxxhIY

编辑:

如果要检查不区分大小写的字符串,则需要更改代码,并添加不区分大小写的检查。我不会添加代码,因为有多种方法可以进行不区分大小写的比较,各有优缺点。

#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
#include <vector>
#include <iterator>

using namespace std;

int main() {
std::vector <std::string> StringVect = { "BB", "aA", "12", "b", "AA", "&", "[", "**", "1" };

std::sort(StringVect.begin(), StringVect.end(), []
(const std::string& s1, const std::string& s2)
{
if (s1.empty() || s2.empty())
return s1 < s2;

// a convenience array
bool ac[] = { isalpha(s1[0]), isalpha(s2[0]),
isdigit(s1[0]), isdigit(s2[0]),
!isalnum(s1[0]), !isalnum(s2[0]) };

// If both strings start with the same type, then return
// s1 < s2
if ((ac[2] && ac[3]) || (ac[4] && ac[5]))
return s1 < s2;

// case insensitive
if (ac[0] && ac[1]) // both strings are alpha
return myCaseInsensitiveComp(s1, s2); //returns true if s1 < s2, false otherwise

// if first string is alpha, or second string is not alphanumeric
// the strings are in order, else they are not
return (ac[0] || ac[5]);
});
copy(StringVect.begin(), StringVect.end(), ostream_iterator<string>(cout, "\n"));
}

同样,myCaseInsensitiveComp 是一个 stub ,您应该用实现此目标的函数填充它。有关链接,请参见:

Case insensitive string comparison in C++

关于C++ 排序 - 普通字母后的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29403929/

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