2010-08-14 11 views
11

Dado el C++ vector de la siguiente manera:Necesita ejemplos en C++ uso de vectores

vector<double> weight; 
weight.resize(128, 0);  

puede pesar usarse como:

weight['A'] = 500.98; 
weight['P'] = 455.49; 

Lo que significa esto, y ¿cómo se utilizan estos valores? ¿Alguien podría darme un ejemplo?

Respuesta

5

El código es equivalente a:

weight[65] = 500.98; 
weight[80] = 455.49; 

Lo que por supuesto sólo funciona si el vector contiene al menos 81 elementos.

+0

Gracias, he corregido – ladyfafa

+0

Parece que tiene 128 por lo que debe estar bien. –

1

No deberías. Uso std::map para ese propósito

Por ejemplo

std::map<char,double> Weight; 

Weight.insert(std::make_pair('A',500.98)); //include <algorithm> 
Weight.insert(std::make_pair('P',455.49)); 

std::cout<< Weight['A']; //prints 500.98 

También puede iterar sobre la map usando std::map<char,double>::iterator

Por ejemplo

std::map<char,double>::iterator i = Weight.begin(); 
for(; i != Weight.end(); ++i) 
    std::cout << "Weight[" << i->first << "] : " << i->second << std::endl; 

/*prints 
    Weight['A'] : 500.98 
    Weight['P'] : 455.49 
*/ 
+0

@Prasoon, bien, lo cambiaré – ladyfafa

+2

Un carácter es un tipo entero, por lo que es un índice válido en una matriz (o vector). Al cambiar de un vector a un mapa, está cambiando los valores de acceso de O (1) a O (log (n)), lo cual no es una buena solución de compromiso. –

+3

@Martin: Nunca dije que no era un índice válido. Acabo de decir que él/ella no debería usar eso porque de hecho sería más confuso. Usar un 'std :: map' es más limpio. 'usted está cambiando los caracteres de acceso de O (1) a O (log (n)) no es una buena compensación '.Eso tendría un impacto significativo si n es un valor muy grande. Para un pequeño valor de 'n' y buscando la sintaxis más limpia de' std :: map', lo recomendaría. Esto no fue en absoluto una buena razón para rechazar votos. Debería rechazar la respuesta cuando la respuesta es completamente incorrecta o engañosa. –

7

literales de caracteres (como 'A' y ' P ') puede convertirse automáticamente en enteros utilizando sus valores ASCII. Así que 'A' es 65, 'B' es 66, etc.

así que su código es el mismo que:

weight[65] = 500.98; 
weight[80] = 455.49; 

La razón por la que nunca quiere hacer esto es si la matriz de peso tiene algo que ver con los personajes. Si lo hace, la asignación de pesos a un carácter literal hace que el código sea más legible que la asignación a un número entero. Pero es solo para "documentación", el compilador lo ve como enteros de cualquier manera.

+0

De acuerdo, veo, estos literales de caracteres se pueden convertir a ints – ladyfafa

+0

Para contar el número de ocurrencias de caracteres ASCII (por ejemplo, antes de calcular un árbol de codificación Huffman) está bien, pero cambiando el juego de caracteres para contener más que el ASCII inferior invalidaría este esquema. –

0

Si quiere esto, puede usar un std::map<char, double>. Técnicamente, también sería posible usar un std::vector<double>, pero habría todo tipo de conversiones integrales de caracteres a enteros y el programa sería confuso.

1

Entiendo que los caracteres literales se convierten en enteros. ¿Admite C++ la tabla extendida ASCII? Por ejemplo si tuviera una

char * blah = 'z'+'z'; 

¿Qué pasaría ??? por ej.

'z' = 122 in ASCII 

lo tanto

'z'+'z' = 244 ?? or ?? 
+0

Probar :) char * blah = 'z'; no compilará, ya que está mezclando un char ('z') y un char * (bla). Si usa char blah: depende de si un "char" es un "char firmado" o "char sin signo" para su compilador. Para el mío, está firmado y por encima de los resultados matemáticos en -12. –