在 Zig 中按字母顺序(升序)对字符串数组进行排序

问题描述 投票:0回答:1

我想按字母升序对水果列表进行排序:

const allocator = std.heap.page_allocator;

var list = std.ArrayList([]const u8).init(allocator);
defer list.deinit();

try list.append("banana");
try list.append("apple");
try list.append("cherry");

// Sort the ArrayList alphabetically using std.mem.sort with the custom comparator
std.mem.sort([]const u8, list.items, ??, ??);

for (list.items) |item| {
    std.debug.print("{s}\n", .{item});
}

我在标准库中找到了这个

std.mem.sort
函数。不确定这是对列表进行排序的更好方法。

当然,我可以从零开始实现该算法,但我想知道目前是否可以以更“曲折”的方式完成它。我读过标准库写得不好,但我想给它一个机会。我当然知道快速排序,但是如何将函数指针/lambda/无论其调用什么传递给

std.mem.sort()
?有什么已经实施了吗? std 中的模板/参数比较函数?

关于为什么我要分配堆内存而不是仅仅将水果推入堆栈?我愿意使用堆栈,我唯一的兴趣是对字符串数组进行排序

sorting zig
1个回答
0
投票

std.mem.sort
是正确使用的功能。它接受切片子类型、切片、“context”和“lessThanFn”。

在您的情况下,不需要上下文,因此我们将传递“void”。

{}
是一个空块表达式,它返回一个 void 类型的值。将参数命名为
_
会丢弃它,因此 zig 不会抱怨它未被使用。
std.mem.order
执行字符串比较。

fn lessThan(_: void, lhs: []const u8, rhs: []const u8) bool {
    return std.mem.order(u8, lhs, rhs) == .lt;
}

fn sortStringSlice(slice: [][]const u8) void {
    std.mem.sort([]const u8, slice, {}, lessThan);
}

上下文参数的用途是当您需要左侧或右侧没有的附加信息来确定是否

lhs < rhs
时。例如,如果您根据另一个数组中的值对索引进行排序:

const Context = struct {
    values: []const []const u8
    fn lessThan(self: Context, lhs: usize, rhs: usize) bool {
        return std.mem.order(u8, self.values[lhs], self.values[rhs]) == .lt;
    }
};

fn sortIndices(indices: []usize, values: []const []const u8) void {
    const context = Context{ .values = values };
    std.mem.sort(usize, indices, context, Context.lessThan);
}
© www.soinside.com 2019 - 2024. All rights reserved.