¿Qué trucos simples de C ++ deberían saber todos?

1.

Desde C ++ 11, hay una nueva forma de bucle usando auto .

Digamos, por ejemplo, que tiene una estructura de datos compleja que usa STL como esta:

  map <int, vector <pair >> myMap;

Significa que tiene un map en el que la clave principal es un entero y el valor correspondiente de una clave es un vector que nuevamente contiene un pair de enteros.

Ahora, para iterar en algún lugar dentro del código, puede usar el iterator C ++ para declarar iterador para este mapa y decir, por ejemplo, que desea apuntar al elemento inicial:

  map <int, vector <pair >> iterator it = myMap.begin ();

En lugar de escribir esto, ahora podemos escribirlo fácilmente desde C ++ 11 en adelante:

  auto it = myMap.begin ();

Después de descubrir el auto , ¡ya no uso la forma anterior! 🙂

2.

Para asignar elementos a un pair , en realidad no necesitamos usar la función make_pair() siempre. Esta instalación probablemente esté disponible en C ++ 11.

Previamente:

  pair  myPair = make_pair (1,2);

Ahora:

  pair  myPair = {1,2};  // No hay necesidad de make_pair ()

Curiosamente, la asignación de valores a muchos contenedores se puede hacer con un método similar en C ++ 11.

3.

C ++ 11 tiene una función llamada to_string() . Me alegré mucho de ver esta función cuando la encontré por primera vez.

  int a = 12;
 string x = to_string (a);

Esta función funciona para casi todo. ¡Adiós a la conversión manual de enteros, dobles, etc. a cadenas! 😀

4.

El rango basado for bucle es otra adición interesante a C ++ 11. Es como Python o Java. Un ejemplo de rango basado for bucle con auto :

Previamente:

  map  myMap;
 para (map  :: iterator it = myMap.begin (); it! = myMap.end (); it ++)
 {
	 // decir para imprimir
	 cout < first) << ":" < second) << endl;
 }

Ahora:

  map  myMap;
 para (auto & it: myMap)
 {
	 cout << it.first << ":" << it.second << endl;
 }

Muy prudente!

5.

Functor!

  // Ordenar un conjunto de pares por segundo valor por functor

 estructura comp
 {
	 operador bool () (const pii & a, const pii & b)
	 {
		 devuelve a.second <b.second;
	 }
 };

 conjunto  s;

Ahora, cada vez que inserte un par en este conjunto, ordenará todo basándose principalmente en el segundo elemento. Por supuesto, puedes cambiar el primer y el segundo elemento y evitar el functor . En caso de que haya casos en los que necesite realizar una clasificación compleja, el functor puede ser de gran ayuda.

Usted puede ver esto.

todo es un objeto, incluso un entero simple.

en lugar de escribir:
int a = 5;

podemos escribir:
int a (5);

Aquí estamos pasando el valor 5 al constructor int.

si alguna vez pudiéramos acceder al archivo de clase int y agregar la palabra clave “explícita” delante de su constructor

int a = 5; nunca compilará, solo int a (5) lo haría.

================================================== ===

Para crear una nueva línea podemos usar:
endl (cout);

en lugar de:
cout << endl;

endl () es una función estándar que toma un objeto ostream como cout como argumento, coloca un ‘\ n’ en esa secuencia, lo vacía y devuelve una referencia al objeto de entrada ostream.

ostream & std :: endl (ostream & os = std :: cout)
{
os.putchar (‘\ n’);
os.fflush ();
retorno os
}

entonces std :: endl (cout);
Genera una nueva línea.

================================================== ======

una referencia de solo lectura.
es decir, crear una referencia a un objeto que es incapaz de modificarlo.

p.ej:
int a = 5;
const int & b = a;

a = 10; // funciona y como se espera, el valor de b también se convierte en 10.
b = 11; // arroja error de compilación.

================================================== =======

Gracias por la A2A.

No es un truco, pero me gusta mucho el operador ternario y me parece que muchos programadores principiantes e intermedios no lo saben o tienen miedo de usarlo.

Es básicamente una forma más corta de escribir si / else.

Puede usarlo para establecer una variable condicionalmente (especialmente útil para configurar variables const):

  const float average_height = isMale ()?  1.753f: 1.616f;

o utilízalo para control de flujo:

  isCat ()?  updateCat (): updateDog ();

También puedes anidarlos (pero puede ser complicado y confuso):

  const float average_height = isGodzilla ()?  106.68f: (isMale ()? 1.753f: 1.616f);

RAII es, con mucho, el más importante. La idea aquí es que cada vez que adquieres algún recurso, como memoria, un bloqueo, un identificador de archivo, etc., implementas una forma en que se libera automáticamente en algún destructor.
Otro es al convertir las condiciones previas de la función en invariantes de clase. Digamos que tienes un vacío f (into, double); donde cada argumento se restringió a un pequeño rango de valores, más pequeño que el rango de sugerencias o dobles. Cambie cada argumento en una clase, que lanza una excepción en el ctor si ese valor está fuera de rango. Esto logra dos cosas:
1. La función ya no tiene que informar ni verificar errores de condición previa. Esto simplifica enormemente la implementación.
2. No hay manera de mezclar los argumentos de la función.

Compilar con el modo de depuración activado y desactivado. Y optimizaciones dentro y fuera.
Usa diferentes compiladores, como g ++ y clang ++.
Pruebe ambos códigos x86 y x64 siempre que sea posible.
Use aserciones, escriba pruebas unitarias, agregue ejecutándolas al Makefile.

Se ahorraría más tiempo del que se necesita.

La Regla de tres en C ++, que dice que si cualquiera define incluso uno de los destructores, constructores de copia u operador de asignación de copia para una clase, entonces los otros dos también deben definirse. Ver Regla de tres (programación en C ++).

¡Verificación simple de errores de compilación en vuelo!
Digamos que estás implementando múltiples clases, estructuras, estás cuidando la herencia y uniéndolas todas y estás arriba. funcion main Suponiendo que se trata de algunas de sus etapas finales, ya ha diseccionado el código en partes más pequeñas y lo ha probado. Es fácil cometer algunos errores de compilación mientras se mantienen atentos a las cosas más “importantes”. En tales casos, tanto en Clang como en GCC puede compilar el código sin siquiera implementar el main Si todo está bien, sin errores de compilación, se imprimirá un mensaje como undefined reference to 'main' ; de lo contrario, imprimirá todos los errores que haya cometido hasta el momento. Personalmente, uso este truco después de terminar una clase o una estructura.

Inicialice la matriz entera con el mismo número . Usando fill_n puede inicializar toda la matriz con el valor predeterminado.

  #include 

 utilizando namespace std;

 int main ()
 {
	 matriz int [5];
	 fill_n (array, 5,10);  // asignar todo el elemento de la matriz con 10
	 para (int i = 0; i <5; i ++)
		 cout << array [i] << endl;
 }

La madre de todos los encabezados.

  #include 

Es básicamente un archivo de cabecera que también incluye todas las bibliotecas estándar y el archivo de inclusión STL. Muy útil para un fragmento de prueba de unidad o concursos de programación en línea. Ver GCC 4.8.0 /bits/stdc++.h source. Aunque incluiría muchas cosas innecesarias y aumentaría el tiempo de compilación. Y esto solo funciona en el compilador GCC.

Las funciones y macros de Variadic son muy pocas para escribir cosas de depuración.

  #include 
 #include 
 #include 
 #include 

 utilizando namespace std;

 #define error (args ...) {vector  _v;  split (#args, ',', _v);  err (_v.begin (), args);  }

 división vacía (const string & s, char c, vector  & result) {
     cadena de cadenas ss (s);
     cadena x;
     while (getline (ss, x, c))
         result.push_back (x);
 }

 void err (vector  :: iterator it) {}
 plantilla 
 void err (vector  :: iterator it, T a, Args ... args) {
     cerr << it -> substr ((* it) [0] == '', it -> length ()) << "=" << a << '\ n';
     err (++ it, args ...);
 }

 int main () {
     int a = 4, b = 8, c = 9;
     error (a, b, c);
 }

Salida:

  a = 4
 b = 8
 c = 9
  int i;
     para (i = 10; i> = 0; i--)
     {
         cout << i << endl;
     } 

puede ser reemplazado con

  int i = 10;
     mientras (i -> 0)
     {
            cout << i << endl;
     } 

C ++ puede tener “Función” dentro de una estructura. Puede llamar a esa función igual que con otros miembros de la estructura.

  #include 
  utilizando namespace std;
  temperatura de la estructura
      int i;
      prueba de vacío () {
          cout << "hola c ++", i;
      }   
  };
 
 
  int main () {
      struct temp t;
      t.test ();
 
  }

Compilado en GCC 4.6.3

Agregaré solo una: la técnica de copiar e intercambiar. Si ha implementado una función de intercambio para su clase, puede usarla para escribir un operador de asignación de excepción segura que funcione tanto para copias como para movimientos, así:

  T y operador = (T otro) {
     swap (otros);
     devuelve * esto;
 }

Aritmética de punteros. Ejemplo copiado de tutorialspoint: aritmética de punteros de C ++

 #include  using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // let us have array address in pointer. ptr = var; for (int i = 0; i < MAX; i++) { cout << "Address of var[" << i << "] = "; cout << ptr << endl; cout << "Value of var[" << i << "] = "; cout << *ptr << endl; // point to the next location ptr++; } return 0; } 

que salidas

Dirección de var [0] = 0xbfa088b0
Valor de var [0] = 10
Dirección de var [1] = 0xbfa088b4
Valor de var [1] = 100
Dirección de var [2] = 0xbfa088b8
Valor de var [2] = 200

No hay trucos como tal pero te sugiero que encuentres
1. Similitudes entre c y c ++ (si está familiarizado con c)
2. Similitudes entre Java y c ++ (si está familiarizado con Java)
C ++ te será fácil aprender