C++, ¿cuál es el motivo del error aquí? ¿Pero este código puede ser AC?
Autor | Jennifer K. K. Kennedy Editor | Ouyang Shuli
Hoy quiero hablarles sobre los archivos de encabezado en C++. Cuando estaba escribiendo un tema de algoritmo para mostrar el código fuente, 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 usé cuando participé en competencias acm en la universidad. Para los concursantes de acm, estos archivos de encabezado son en realidad un juego de niños.
Hoy echaré un vistazo a los secretos ocultos en el archivo de encabezado acmer.
Primero, veamos mi código de encabezado completo. incluir
#include
#include
#include
#include < mapa& gt;
#include
#include <algoritmo>
#include
#definir representante (i,a,b) para (int i=a;i
#define Rep(i,a,b) para (int i=a;i>b;i- -)
#define foreach(e,x) for (__typeof(x.begin())) e=x.begin()) e=x.begin();e!=x.end ();e++). end();e ++)
#define mid ((l+r)>>1)
#define lson (k<<1)
#define rson (k<<1|1)
#define MEM(a,x) memset(a,x ,sizeof a)
#define par pii
#define LL long long
usandonamespacestd;
constint N=500005;
constlonglong Mod=99997867; p> p>
Haga clic para ingresar la descripción de la imagen
parte incluida
Primero, veamos la parte incluida una por una. iostream No hace falta decir que este es el archivo de encabezado de entrada/salida estándar de C++, que contiene los flujos de entrada/salida de C++. Las funciones cin y cout son las funciones cin y cout clásicas. Hablando de cin y cout, la sobrecarga de cin y cout es mucho más lenta que la de scanf y printf en lenguaje C, lo que puede afectar fácilmente el rendimiento del programa. Entonces, para acmer, si puedes hacer algo con scanf y printf, nunca usarás cin y cout. 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 escribirán un bucle ellos mismos, leerán un carácter y luego lo convertirán a int o float. Por supuesto, en la mayoría de los casos. no es necesario hacer esto. Por supuesto, en la mayoría de los casos esto no será necesario.
cstdio e iostream hacen lo mismo, pero son funciones de entrada/salida en lenguaje C.
cstring también pertenece al lenguaje C. Es una biblioteca de cadenas en lenguaje C y contiene muchas funciones relacionadas con cadenas. Además, por motivos de rendimiento, lo que se puede hacer con char[] en C no es necesario hacerlo con string en C++. No hace falta decir que la siguiente biblioteca de cadenas también es una biblioteca de procesamiento de cadenas para C++.
La biblioteca cstdlib es equivalente a stdlib.h en lenguaje C. Encapsula algunas funciones de biblioteca de uso común, como rand, srand, free, malloc, etc.
cstdlib es una biblioteca C++.
La biblioteca cmath es equivalente a math.h en lenguaje C. Encapsula algunas funciones de la biblioteca relacionadas con las matemáticas, como pow, sqrt, etc.
Esta última biblioteca también es equivalente a stdlib.h en lenguaje C.
Las bibliotecas de colas, vectores, mapas y conjuntos son bibliotecas STL que contienen algunas estructuras de datos útiles. Por ejemplo, cola encapsula colas y colas, mientras que prioridad_queue son colas, colas y colas prioritarias. Los vectores, mapas y conjuntos son listas, mapas y conjuntos lineales que pueden reducir en gran medida la complejidad de la codificación.
La biblioteca de algoritmos se transforma en una biblioteca de algoritmos que, naturalmente, encapsula muchos algoritmos. Por ejemplo, ordenar, invertir, siguiente_permutación, límite_inferior, límite_superior, etc.
La última biblioteca de funciones, como sugiere el nombre, no se usa mucho. Encapsula algunas operaciones en objetos de función. Por ejemplo, enlazar, reference_wrapper, etc.
De hecho, con respecto a la inclusión, existe una forma inteligente de incluir todos los archivos de encabezado a la vez:
#include
Pero Hay un pequeño problema con este enfoque: no todos los entornos lo admiten, especialmente en el caso de las competiciones oficiales.
Haga clic para ingresar una descripción
Definiciones
Las definiciones son una característica muy poderosa de C++ que le permite definir reglas de reemplazo de código. El uso de definiciones también simplifica enormemente la codificación. Sin embargo, nunca te excedas. Si usa definir demasiado, no solo afectará la legibilidad del programa, sino que también puede afectar la codificación de otras personas. Por eso muchas grandes empresas prohíben el uso de definiciones. Personalmente creo que no tienes que tomarte tan en serio las definiciones, puedes usarlas siempre que sigas las reglas y las uses de manera razonable.
Las dos primeras líneas son la definición del bucle for.
#define rep(i,a,b) para (int i=a;i
#define Rep(i,a,b) para (int i=a;i>b;i--)
#define foreach(e,x) for (__typeof(x.begin()) e=x.begin();e!=x. Donde i es la variable del bucle, a y b son los límites superior e inferior del bucle, tenga en cuenta que son intervalos cerrados por la izquierda y abiertos por la derecha.
Rep sigue la misma lógica, pero el orden del bucle. se invierte.
foreach usa una nueva característica de C++11, que permite la iteración automática. Esta característica no se usa comúnmente, pero es muy conveniente en algunos casos. mid ((l + r. )>>1)
Esta línea se usa para búsqueda binaria, donde el límite izquierdo es l y el límite derecho es r, por lo que su punto medio es (l + r) / 2, que se representa mediante operaciones de bits como (l + r) >> 1. Ejemplo:
#Antes de la definición
Aunque (l + 1) <> 1) es el punto medio , no es el punto medio.
mientras (l + 1 < r) {
int m = (l + r) >> 1;
if (a[m] <= v) {
l = m;
}else {
r = m;
}
}}
# Definición de publicación
while (l + 1 < r) {
if (a[mid] <= v) {
l = mid;
}else {
r = medio
}
}
}
#define lson (k<& lt;1)
#define rson (k<<1|1)
Estas dos líneas se usan principalmente para árboles de filas debido a C++ tendencia En lugar de usar clases para árboles en hileras, use matrices para simular árboles en hileras. En el árbol de filas, si la identificación de un nodo es u, entonces la identificación de su nodo hijo izquierdo es 2 x u, y la identificación de su nodo hijo derecho es 2 x u + 1. Utilice u << 1 y u < en bits operaciones < 1 | 1 significa.
#define MEM(a,x) memset(a,x,sizeof a)
#define par de pii<<<<<<1 | define par de pii
#define LL long long
Las últimas tres líneas están juntas. La primera línea es la abreviatura de memset, que se puede utilizar para inicializar la matriz. pii es la abreviatura de par
Con respecto a la redefinición de tipos, usar define aquí no es muy bueno. Una mejor manera es usar typedef. Por ejemplo, el par anterior y long long se pueden escribir así:
typedef. pair< int, int> pii;
typedeflonglong LL;
Esto está más estandarizado que definir, que es un reemplazo contundente de cadenas, mientras que typedef es un alias de tipo que puede compilarse mediante comprobaciones del compilador, por lo que es mejor usar typedefs si puede.
Haga clic en la imagen para ingresar una descripción
Conclusión
Además de los archivos de encabezado utilizados anteriormente, también hay algunos usos más avanzados, como algunas plantillas. clases y algunos algoritmos comunes, como gcd, etc. Pero personalmente no creo que signifiquen mucho. Pero personalmente no creo que tenga mucho sentido. Para entrevistas y sesiones de codificación, basta con utilizar los archivos de encabezado anteriores.
El centro de datos iCloud (Gui'an) de Apple se pone en uso; NetEase anuncia el resultado del manejo de comentarios inapropiados por parte de RR.HH.: ha sido despedida; la base de datos OceanBase será de código abierto | p>El programador tiene 35 años ¿Es hora de jubilarse?
Del "No seas malo" al "La puerta está ahí", la historia de la ética de la inteligencia artificial de Google