Clase contenedora de bytes

Iniciado por Kaxperday, 18 Octubre 2015, 17:30 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Buenas, necesito escribir en un archivo y busco una clase contenedora de bytes, como por ejemplo podría ser vector<byte>, pero me vendría mejor una clase especializada, al igual que lo es string para cadenas de caracteres.

¿alguno sabe que clase es la que busco o si existe?, me vendría bien con métodos como find() etc.

Un saludo.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Tienes a tu disposición todos los contenedores de la STD: vector, deque, list, ...
Si quieres find, u otra función, los tienes en la librería <algorithm>. Trabaja con iteradores, así que sirven para cualquier contenedor.

Kaxperday

#2
Vamos que no hay un contenedor especializado para bytes.

Entonces, usaré vector<u_char>, pero ¿no quemara mucho la CPU si tengo que ir metiendo byte a byte dentro del vector con push_back()?

Imagina que son 3 megas, habría 3000000 de push_back() copiando byte a byte dentro del vector, además vector<> tenía un límite de miembros máximo, y creo que se podría susperar en casos como este.

Edito: El maximo del vector depende del tipo tiene sentido: En este caso puede llegar a almacenar: 42949672951 bytes. Unos 42 gigas XDDD.

Para escribir los bytes usare ofstream simplemente, el problema sería al leerlos habría que almacenarlos en un vector<> de bytes, con ifstream y luego ya una vez tenga el vector correcto aplico funciones como find() etc.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

El límite de vector depende, pero suele llegar a la giga. 3 MB es poco.
¿Quemar la CPU por llenar un vector de 3 MB? ._.
No infravalores una computadora xD

De todos modos, tienes varias formas de llenarlo. Lo mejor es que no empieces elemento a elemento. Primero, puedes usar vector::reserve para reservar la memoria inicial que requieras (evidentemente tener que copiar el vector constantemente al meter elementos es muy ineficiente).

También puedes usar vector::resize. Se diferencia de reserve en que este realmente cambia el tamaño del vector, no solo de su memoria.

Si has hecho resize, en evz de push_back, puedes usar iteradores o índices para rellenarlo.

Kaxperday

Según vector.max_size(), puede llegar a almacenar 42,949672951 GBytes, otra cosa es que haya memoria en el ordenador para que eso sea posible XD.

El problema será en que no como leer con ifstream y meterlo en un vector al momento, con iteradores como dices, si sabia de resize(), la idea sería hacer resize y leer elemento a elemento del archivo y meterlo dentro del vector?, pero es muy ineficiente, ¿qué habría mejor?.

Ahora busco un poco como sería, la mejor manera entonces es ¿leer todo el contenido del archivo, meterlo en un vector<u_char>?

O igual se me está yendo mucho la olla y era mejor u_char* array= new u_char[tamaño]();

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Como digo, leer 3 MB no es nada. Lo más lento es la lectura del archivo, para lo cual debes usar un array.
En difinitiva, buena parte de las opciones han sido dadas. Ahora elige la más eficiente para el uso que le vas a dar.