首页 > 解决方案 > 结构成员可以保存为变量吗?

问题描述

我有一个 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(),我必须使用我写出的排序算法。因此,我试图避免两次编写本质上相同的代码的困境。

标签: c++sorting

解决方案


我认为您可以将不同的比较器功能用作“选项”。并将所需的比较器提供给排序功能,无论您是使用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,你可以创建自己的排序函数,它将比较器函数作为参数,它也可以工作。


推荐阅读