У меня есть структура:

public struct Deque<T> {

    private var array = [T]()

    public var isEmpty: Bool {
        return array.isEmpty
    }

    public var count: Int {
        return array.count
    }

    public mutating func enqueue(_ element: T) { //inserts element at end
        array.append(element)
    }

    public mutating func enqueueFront(_ element: T) { //inserts element at beginning
        array.insert(element, at: 0)
    }
}

И объявляю структуру так:

var burst = [Deque<Int>()]

И я инициализирую его так в цикле for:

for i in 0..<9 {
    for j in 0..<10{
    if processes[i][j] != 0{
        burst[i].enqueue(processes[i][j])
    }
  }
}

Я могу успешно инициализировать индекс 0 моей структуры, однако всякий раз, когда я перехожу к индексу 1, я получаю сообщение об ошибке:

Неустранимая ошибка: индекс вне диапазона

Как быстро объявить и инициализировать динамический массив структур?

3
grantespo 23 Окт 2018 в 19:39

2 ответа

Лучший ответ
var burst = [Deque<Int>()]

Он объявляет burst массивом объектов 1 Deque. Вы пытаетесь получить доступ к burst[i], где i больше 0, что выходит за пределы диапазона burst.

Вы можете использовать инициализатор массива init(repeating:count:) (doc), например так:

var burst = Array<Deque<Int>>(repeating: Dequeue<Int>(), count: 10)
4
Kon 23 Окт 2018 в 16:44

Вы создаете только один элемент типа «Deque» в массиве «burst» с помощью этой команды:

var burst = [Deque<Int>()]  //There is only one element inside the array

Вот почему, когда вы пытаетесь получить доступ к массиву "burst" с i> 0, он вылетает. Вам нужно инициировать новый объект Deque перед добавлением в массив, а затем вызвать

burst[i]

Потом

Вы можете сделать это следующим образом:

for i in 0..<9 {
  for j in 0..<10{
    if processes[i][j] != 0{
        var queue = Deque<Int>()
        queue.enqueue(processes[i][j])
        burst.append(queue)
    }
  }
}
3
Cuong Vuong 23 Окт 2018 в 16:56
52953973