example ejemplo container clase c++ c++11 stdset

ejemplo - set string c++



¿Por qué std:: set parece forzar el uso de un const_iterator? (4)

Considere el sencillo programa a continuación, que intenta recorrer los valores de un conjunto utilizando referencias NO constantes a los elementos que contiene:

#include <set> #include <iostream> class Int { public: Int(int value) : value_(value) {} int value() const { return value_; } bool operator<(const Int& other) const { return value_ < other.value(); } private: int value_; }; int main(int argc, char** argv) { std::set<Int> ints; ints.insert(10); for (Int& i : ints) { std::cout << i.value() << std::endl; } return 0; }

Al compilar esto, recibo un error de gcc:

test.c: In function ‘int main(int, char**)’: test.c:18:18: error: invalid initialization of reference of type ‘Int&’ from expression of type ‘const Int’ for (Int& i : ints) { ^

Sí, ya sé que no estoy intentando modificar los elementos en el bucle for. Pero el punto es que debería poder obtener una referencia no constante para usar dentro del bucle, ya que el conjunto en sí no está calificado. Obtengo el mismo error si creo una función de establecimiento y la uso en el bucle.


De la referencia del cpp :

En un conjunto, el valor de un elemento también lo identifica (el valor es en sí mismo la clave, de tipo T), y cada valor debe ser único. El valor de los elementos en un conjunto no se puede modificar una vez en el contenedor (los elementos siempre son constantes ), pero se pueden insertar o eliminar del contenedor.


El comportamiento es por diseño.

Darte un iterador no constante podría inspirarte a cambiar el elemento en el conjunto; el siguiente comportamiento iterativo sería indefinido.

Tenga en cuenta que el estándar de C ++ dice que set<T>::iterator es const por lo que la forma antigua de C ++ 11 aún no funcionaría.


Un conjunto es como un mapa sin valores, solo claves. Dado que esas claves se utilizan para un árbol que acelera las operaciones en el conjunto, no pueden cambiarse. Por lo tanto, todos los elementos deben ser constantes para evitar que se rompan las restricciones del árbol subyacente.


std::set utiliza los valores contenidos para formar una estructura de datos rápida (generalmente, un árbol rojo-negro). Cambiar un valor significa que toda la estructura necesita ser alterada. Por lo tanto, forzando la const , std::set evita que lo empujes a un estado no utilizable.