2010-03-03 12 views
11

Tengo una estructura de datos vector<set<char> > (base de datos de transacciones) y quiero saber el tamaño de la misma. Cuando uso sizeof() con cada set<char> el tamaño es 24 a pesar de que el conjunto contiene 3, 4 o 5 caracteres. Más tarde, cuando uso sizeof() con el vector<set<char> > el tamaño es 12 ... supongo que esta no es la forma de conocer el tamaño de una estructura de datos. ¿Alguna ayuda? Gracias.sizeof() un vector

+8

sizeof() es un operador de tiempo de compilación –

Respuesta

18

Quiere vector::size() y set::size().

Suponiendo v es su vector, hacer esto:

size_t size = 0; 
for (vector<set<char> >::const_iterator cit = v.begin(); cit != v.end(); ++cit) { 
    size += cit->size(); 
} 

sizeof() le está dando el tamaño en memoria del objeto/tipo que se aplica, en múltiplos de sizeof(char) (normalmente un byte). Si desea saber el tamaño en memoria del contenedor y sus elementos, se puede hacer esto:

sizeof(v) + sizeof(T) * v.capacity(); // where T is the element type

+0

¿Qué pasa si ya ha reservado su vector? –

+1

@John: ¿Qué pasa si él * tiene *? 'reserve()' no tiene * nada * que ver con 'size()'. –

+0

Creo que John quiere decir que si quiere tener alguna idea de cuánta memoria ocupa el vector (y el contenido), debería estar mirando la capacidad, no el tamaño. "tamaño en memoria del contenedor y sus elementos" es, por supuesto, ambiguo, pero sospecho que es más probable que se entienda que se relaciona con la cantidad de memoria asignada por el vector, en lugar de la cantidad de memoria que actualmente ocupan los elementos. –

2

sizeof() se calcula en tiempo de compilación, así que no hay forma en que se le puede decir cuántos elementos tiene adentro

Utilice el método size() del objeto vector.

7

sizeof devuelve el tamaño del objeto en sí. si contiene un puntero a una matriz, por ejemplo, no contará el tamaño de la matriz, solo contará el tamaño del puntero (4 en 32 bits) para el uso del vector .size

0

Utilice vector::size() para determinar el número de elementos en el vector . Sugerencia: se asignan en la tienda gratuita.

5

Vector se implementa utilizando punteros internos para el almacenamiento real. Por lo tanto, sizeof() siempre devolverá el mismo resultado que no incluye el almacenamiento de datos en sí. Pruebe usar el método vector::size() en su lugar. Esto devolverá la cantidad de elementos en el vector.

1

vector en STL es una plantilla de clase, cuando se le da parámetro de plantilla dentro de <SomeType> siguiente vector, compilador C++ código generado para una clase de tipo SomeType. Por lo tanto, cuando rellene el vector utilizando push_back, en realidad está insertando otro objeto de SomeType de modo que cuando solicite .size() desde el compilador, le proporcione el número de objetos SomeType insertados por usted.
Espero que ayude!

+1

Bueno, esa es una respuesta de alrededor del establo ... ¿Quién dijo que está usando 'push_back' y cómo es eso relevante? ¿Cómo es relevante el hecho de que el vector es una plantilla? Pero al menos tienes el punto de que 'size()' es lo que el OP está buscando. –

+1

@STingRaySC Estaba tratando de explicar a OP que sizeof no tiene nada que ver con lo que él/ella quería. Es el método .size() que él (él/ella) debería estar buscando. –