c++ - 结构成员可以保存为变量吗?
问题描述
我有一个 switch 语句,根据用户的输入将根据 array[i].name 对数组进行排序或按 array[i].mark 排序
switch(input){
case 1:
for(int i = 1; i < size; i++){
structure_name choice = Array[i];
int j = i - 1;
while(j >= 0 && tolower(choice.name[0]) <= tolower(Array[j].name[0])){
Array[j + 1] = Array[j];
j = j - 1;
}
Array[j+1] = choice;
}
break;
case 2:
for(int i = 1; i < size; i++){
structure_name choice = Array[i];
int j = i - 1;
while(j >= 0 && choice.mark <= Array[j].mark){
Array[j + 1] = Array[j];
j = j - 1;
}
Array[j+1] = choice;
}
break;
default:
break;
}
如您所见,我执行了两次选择排序。是否可以执行类似...
if(input == 1){
option = .name
}else if(input == 2){
option = .mark
}
这样我就可以只使用一种类型并更改它从数组中获取的变量。注意:我不能使用 sort(),我必须使用我写出的排序算法。因此,我试图避免两次编写本质上相同的代码的困境。
解决方案
我认为您可以将不同的比较器功能用作“选项”。并将所需的比较器提供给排序功能,无论您是使用std::sort
还是定制的手工制作。
考虑以下struct
(您忘记指定):
struct MyStruct
{
std::string name;
int mark;
};
您可以将“选项”定义为比较器功能:
int mark_cmp(const MyStruct & lhs, const MyStruct & rhs)
{
return lhs.mark < rhs.mark; // Compare by mark
}
int name_cmp(const MyStruct & lhs, const MyStruct & rhs)
{
return lhs.name.compare(rhs.name); // Compare by name
}
然后你可以简单地写:
int main()
{
unsigned int input = 1;
MyStruct arr[5] {{"foo", 5}, {"bar", 6}, {"baz", -9}, {"foobar", 0}, {"foobaz", -3}};
switch(input)
{
case 1: std::sort(arr, arr+5, &name_cmp); // input == 1 ? sort by name
break;
case 2: std::sort(arr, arr+5, &mark_cmp); // input == 2 ? sort by mark
break;
default:;
}
return 0;
}
注意:您不必break
在最后一条语句之后switch
(在您的情况下,在 之后default
,不需要break
)。
注意2:我使用原始数组更接近您所做的,但我建议您使用 astd::array
代替。或者,std::vector
如果您需要动态容器。
如果你不能使用std::sort
,你可以创建自己的排序函数,它将比较器函数作为参数,它也可以工作。
推荐阅读
- javascript - 如何检查 Object 中键的值并在 if 语句中使用它?JavaScript
- python - 从网站列表中提取标签时,提取为一系列列表
- html - 制作两列,每列有 2 张图片
- swift - 当窗口在 Swift 中全屏显示时,如何获得通知?
- jenkins - Jenkins 检索上次成功构建的详细信息
- javascript - 使用 Typescript 使用 getInitialProps 将 prop 传递到 Next.js 中的每个页面
- javascript - 谷歌标签管理器自定义模板沙盒 Javascript 问题
- mysql - 基于类别的SQL求和
- kotlin - Kotlin - 列表过滤函数的函数式编程递归实现
- c# - 将类类型列表传递给 Oracle 过程 c#