¿Qué tan seguras son las colecciones rápidas cuando se usan con iteradores / índices invalidados?

No veo mucha información en la referencia rápida de stdlib. Por ejemplo, Dictionary dice que ciertos métodos (como eliminar) invalidarán los índices, pero eso es todo.

Para que un lenguaje se llame a sí mismo "seguro", necesita una solución para las pistolas clásicas C ++:

obtenga el puntero al elemento en un vector, luego agregue más elementos (el puntero ahora está invalidado), ahora use el puntero, bloquee

comenzar a iterar a través de una colección. mientras itera, elimine algunos elementos (antes o después de la posición actual del iterador). Continuar iterando, bloquearse.

(editar: en c ++, eressuerte bloquearse - peor es el daño de memoria)

Creo que 1 se resuelve con rapidez porque si una colección almacena clases, tomar una referencia (por ejemplo, un puntero fuerte) a un elemento aumentará el recuento. Sin embargo, no sé la respuesta para 2.

Sería súper útil si hubiera una comparación de pistolas en c ++ que se resuelven / no con rapidez.

EDITAR, debido a la respuesta de Robs:

Parece que hay un comportamiento similar a una instantánea no documentada que ocurre con Dictionary y / o para bucles. La iteración crea una instantánea / copia oculta cuando comienza.

Lo que me da un gran "WAT" y "genial, eso es algo seguro, supongo", y "¿cuánto cuesta esta copia?".

No veo esto documentado ni en Generator ni en for-loop.

El siguiente código imprime dos instantáneas lógicas del diccionario. La primera instantánea esuserInfo como estaba al comienzo del ciclo de iteración, y no refleja ninguna modificación realizada durante el ciclo.

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)")
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta