C, chicos, miren los errores aquí. ¿Por qué? Pero, ¿puede este código comunicarse? !
Hoy quiero hablarles sobre los archivos de encabezado en C. Cuando estaba escribiendo el código fuente de visualización del algoritmo, muchos amigos me dejaron mensajes diciendo que estaban sorprendidos por el contenido de mi archivo de encabezado. De hecho, la razón por la que mi archivo de encabezado es tan complicado es porque lo he estado usando desde la competencia universitaria acm. Para los jugadores de competición de acm, estos archivos de encabezado son en realidad un juego de niños.
Hoy, echemos un vistazo a los secretos ocultos en el archivo de encabezado acmer.
Primero, veamos el código completo de mi archivo de encabezado.
# incluir ltiostream gt
# incluir ltcstdio gt
# incluir ltcstring gt
# incluir ltstring gt
# incluir ltcstdlib gt
# incluir ltcmath gt
# incluir ltqueue gt
# incluir ltvector gt
# incluir lt map gt
# incluir ltset gt
# incluir lt algoritmo gt
# incluir lt funcional gt
#define rep( i, a, b) para (int I = a; i ltb; i )
#Definición Rep(i, a, b) para (int I = a; i gtb; i -)
p>#define foreach(e, x)for(_ _ tipo de(x . comenzar())e = x . comenzar(); e! = x . end(); e )
#Definir mid((l r)>; gt1)
#Definir Erson(k lt lt1)
#Definir rson(k lt; lt1|1) p>
#Definir conjunto de memoria MEM (a, x) (a, x, tamaño de a)
#Definir pii para ltint, int gt
#Definir LL long long
usingnamespacestd
constint N = 500005
constlonglong Mod = 99997867
Haga clic para ingresar la descripción de la imagen.
Piezas incluidas
Primero, veamos las piezas incluidas. Veamos los iostreams uno por uno. No hace falta decir que los archivos de encabezado de entrada y salida estándar de C contienen las funciones C iostream, que son las clásicas cin y cout. Hablando de cin y cout, la sobrecarga de cin y cout en lenguaje C es mucho más lenta que la de scanf y printf, lo que afecta fácilmente el rendimiento del programa. Entonces, para acmer, lo que scanf y printf pueden hacer, cin y cout nunca podrán hacerlo. Por supuesto, scanf y printf no son los más rápidos, también hay getchar y putchar más rápidos, por lo que algunos jugadores leerán char manualmente y lo convertirán en una función int o float. Por supuesto, esto no es necesario en la mayoría de los casos.
Cstdio tiene la misma función que iostream, pero es una función de entrada y salida en lenguaje C, por lo que no entraré en detalles.
Cstring también pertenece al lenguaje C. Es una biblioteca de cadenas en lenguaje C y tiene muchas funciones relacionadas con cadenas.
Nuevamente, por razones de rendimiento, no necesita usar una cadena C si puede usar char[] en C. No hace falta decir que la siguiente biblioteca de cadenas es la biblioteca de procesamiento de cadenas C.
La función de biblioteca de cstdlib es equivalente a stdlib.h en lenguaje C y encapsula algunas funciones de biblioteca de uso común, como rand, s rand, free, malloc, etc.
La biblioteca Cmath es equivalente a math.h en lenguaje C y encapsula algunas funciones de la biblioteca relacionadas con operaciones matemáticas, como pow, sqrt, etc.
Las siguientes colas, vectores, texturas y colecciones son bibliotecas STL que contienen algunas estructuras de datos útiles. Por ejemplo, cola encapsula cola y retirada de cola, así como prioridad_queue, que es cola, retirada de cola y cola de prioridad. Los vectores, mapas y conjuntos son listas lineales, tablas de mapeo y conjuntos, respectivamente. Usarlos con habilidad puede reducir en gran medida la complejidad de la codificación.
La biblioteca de algoritmos se traduce en una biblioteca de algoritmos que, naturalmente, encapsula muchos algoritmos. Por ejemplo, ordenar, voltear hacia atrás, siguiente disposición completa bajo las funciones next_permission, lower_bound, Upper_bound, etc.
La última biblioteca de funciones rara vez se utiliza. Como sugiere el nombre, encapsula algunas operaciones en objetos de función. Como vincular, reference_wrapper, etc.
De hecho, existe una forma inteligente de incluir todos los archivos de encabezado al mismo tiempo:
# include ltbits/stdc . h gt
Sin embargo, hay un pequeño problema con este método. No todos los entornos lo admiten, especialmente las competiciones oficiales. En términos generales, todo el mundo lo utilizará en algunas competiciones en línea. Personalmente, soy demasiado vago para distinguir entre entornos, así que estoy acostumbrado a incluirlos uno por uno.
Haga clic para ingresar una descripción de la imagen.
Definir partes
Definir es una función muy poderosa en C que puede definir reglas en lugar de código. El uso competente de define también puede simplificar enormemente la codificación. Pero lo que hay que tener en cuenta es que nada es demasiado ni demasiado poco. El uso de demasiadas definiciones afectará la legibilidad del programa y también puede afectar la codificación de otras personas. Por lo tanto, muchas grandes empresas prohíben el uso de definir. Personalmente no creo que sea tan grave. Se puede usar define, solo úselo correctamente de acuerdo con las especificaciones.
La primera línea son estas dos líneas, que son las definiciones del bucle for.
#Definir rep(i,a,b)for(int I = a;iltb;i)
#Definir Rep(i,a,b)for(int I = a;i gtb;i-)
#define foreach(e, x)for(_ _ tipo de(x . comenzar())e = x . comenzar(); e != x . fin (); e )
Rep es la abreviatura de repetir. Al usarlo, solo necesita rep(i, A, B) para reemplazar el bucle for largo, donde I es la variable del bucle, A y B son los límites superior e inferior del bucle respectivamente. Tenga en cuenta que el intervalo está cerrado. la izquierda y abierto a la derecha.
Rep tiene la misma lógica, es solo un ciclo inverso.
Foreach utiliza las nuevas funciones de C 11, que pueden realizar iteraciones automáticas, lo cual es muy conveniente en ciertos escenarios.
#Define mid((l r)>; gt1)
Esta línea se usa en el método de búsqueda binaria. El límite izquierdo es L y el límite derecho es R, por lo que su punto medio. es (l r)/2, expresado mediante operaciones de bits: (LR)> gt;
Ejemplo:
#definir antes
mientras(l 1 lt; r) {
int m = (l r)> gt1
if(a[m] lt; = v) {
l = m;
} En caso contrario {
r =
}
}
Después de # definir
while(l 1 lt; r) {
if(a[mid ] lt; = v) {
l = medio
}else {
r = medio
}
}
#Define Erson(k lt lt1)
#Define rson(k lt; lt1|1)
Estas dos líneas se utilizan principalmente para líneas árboles de segmentos, porque C a menudo no usa clases para implementar árboles de segmentos de línea, sino que los simula a través de matrices. En el árbol de segmentos, si la identificación de un nodo es U, entonces su hijo izquierdo es 2 x u y el identificador de su hijo derecho es 2 x u 1, lo cual se representa mediante operaciones de bits como U
#Define MEM (a, x) Conjunto de memoria (a, x, tamaño de a)
#Definir pii a ltint, int gt
#Definir LL long long
El Las últimas tres líneas se colocan juntas, la primera línea es la abreviatura de memset, que se puede utilizar para inicializar la matriz. La abreviatura de Pii es par
Con respecto a la redefinición de tipos, no es bueno usar define aquí. Una mejor manera es usar typedef. Por ejemplo, el par anterior y long long se pueden escribir como:
typedef pair ltint, int gtpii
typedeflonglong LL
Esto está más estandarizado que la definición , porque la definición es un reemplazo contundente de cadenas y typedef es un alias de tipo que el compilador puede verificar, por lo que puede usar typedef o typedef.
Haga clic para ingresar una descripción de la imagen.
Fin del movimiento
Además de los archivos de encabezado mencionados anteriormente, también existen algunos usos más avanzados, como algunas clases de plantilla, algunos algoritmos de uso común, como gcd, etc. Pero personalmente no creo que signifique mucho. Para los aspectos de codificación de entrevistas y pruebas escritas, el archivo de encabezado anterior es suficiente.
El centro de datos iCloud de Apple se pone en funcionamiento; NetEase anuncia el resultado del manejo de comentarios inapropiados por parte de Recursos Humanos: expulsión; la base de datos OceanBase será de código abierto | Geek Headlines
Si los programadores se jubilan en el 35 años?
Del “No hagas el mal” al “La puerta está ahí”, la historia ética de la IA de Google