Насколько безопасны быстрые коллекции при использовании с недействительными итераторами / индексами?

Я не вижу много информации в быстрой ссылке на stdlib. Например, словарь говорит, что определенные методы (например, удаление) лишают законной силы индексы, но это все.

Чтобы язык мог называть себя «безопасным», ему необходимо решение классических C ++ лакунов:

получить указатель на элемент в векторе, затем добавить больше элементов (указатель теперь недействителен), теперь использовать указатель, сбой

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

(редактировать: в C ++, высчастливый сбой - в худшем случае это повреждение памяти)

Я считаю, что 1 решается с помощью swift, потому что, если коллекция хранит классы, взятие ссылки (например, сильного указателя) на элемент увеличит количество ссылок. Тем не менее, я не знаю ответ на 2.

Было бы очень полезно, если бы в С ++ было сравнение гангстеров, которые не решаются с помощью swift.

РЕДАКТИРОВАТЬ, из-за ответа Робс:

Похоже, что в словаре и / или для циклов происходит какое-то недокументированное поведение, похожее на снимок. Итерация создает моментальный снимок / скрытую копию при запуске.

Что дает мне и большую «WAT» и «круто, это вроде безопасно, я думаю», и «насколько дорогая эта копия?».

Я не вижу этого ни в Генераторе, ни в цикле for.

Приведенный ниже код печатает два логических снимка словаря. Первый снимокuserInfo как это было в начале цикла итерации, и не отражает какие-либо изменения, сделанные во время цикла.

var userInfo: [String: String] = [
    "first_name" : "Andrei",
    "last_name" : "Puni",
    "job_title" : "Mad scientist"
]

userInfo["added_one"] = "1"  // can modify because it's var

print("first snapshot:")
var hijacked = false
for (key, value) in userInfo {
    if !hijacked {
        userInfo["added_two"] = "2"  // doesn't error     
        userInfo.removeValueForKey("first_name")  // doesn't error
        hijacked = true
    }
    print("- \(key): \(value)")
}

userInfo["added_three"] = "3" // modify again

print("final snapshot:")
for (key, value) in userInfo {
    print("- \(key): \(value)")
}

Ответы на вопрос(1)

Ваш ответ на вопрос