Как объединить два массива?

[indent=4]

init
    x: array of int = {1, 2, 3}
    y: array of int = {4, 5, 6}
    z: array of int = x + y

Приведенный выше код создает это сообщение об ошибке:

concat_arrays.gs:6.23-6.27: error: Incompatible operand
    z: array of int = x + y

Перевод на Вала не работает лучше:

int main () {
    int[] x = {1, 2, 3};
    int[] y = {4, 5, 6};
    int[] z = x + y;
    return 0;
}

Сообщение об ошибке:

concat_arrays_v.vala:4.15-4.19: error: Incompatible operand
    int[] z = x + y;

Как правильно это сделать?

1 ответ

Решение

С помощью GLib.Array<T>:

int main () {
    int[] x = {1, 2, 3};
    int[] y = {4, 5, 6};
    Array<int> a = new Array<int> (false, true, 0);
    a.append_vals (x, x.length);
    a.append_vals (y, y.length);
    // taking over ownership avoids array copying
    int[] z = (owned) a.data; 

    foreach (var i in z) {
        stdout.printf ("%d ", i);
    }
    stdout.printf ("\n");

    return 0;
}

Версия Genie:

[indent=4]

init
    x: array of int = {1, 2, 3}
    y: array of int = {4, 5, 6}
    var a = new Array of int (false, true, 0)
    a.append_vals (x, x.length)
    a.append_vals (y, y.length)
    z: array of int = (owned) a.data

Обновление: после ответа на этот вопрос я изменил приведенный выше код для использования (owned) что позволяет избежать ненужной операции копирования массива.

new Array<T> все еще добавляет некоторые накладные расходы для выделения объекта, но это не должно быть проблемой в большинстве случаев.

С помощью Memory.copy опасно, так как может вызвать всевозможные проблемы с памятью.

Другие вопросы по тегам