Creo que no debería suponer nada y poner toda la historia delante. Eso haría más justicia a la pregunta.
#include → Esta línea de código es una directiva de preprocesador. Le dice al programa que incluya un paquete llamado iostream. Primero se añaden algunos bloques de código adicionales a su código fuente y luego el programa compila. Este código adicional está presente en el archivo iostream que ya está presente en el compilador. Esto no hace ninguna diferencia a su código fuente y más bien forma un programa compuesto.
Esto plantea la pregunta de por qué es necesario añadir el contenido de iostream a su código fuente. La respuesta tiene que ver con las diversas funciones que utilizas mientras escribes tu código. Funciones como cout y cin. Este código adicional facilita el uso de estas funciones ya que tiene su código de definición en él. Así que ahora ya sabes lo que hace la directiva del preprocesador. Piensa que este código adicional se te proporciona para ahorrarte la molestia de escribir código relacionado con la interacción con el hardware y tras la complicación este código sustituye al "include " en tu código fuente antes de la compilación.
Básicamente la diferencia entre iostream e iostream.h radica en los estándares definidos para C++. ".h" se utilizaba en la era previa al desarrollo de C++. Mientras que los nuevos estándares no tienen ".h" en él. Así que lo que esto hace es que ya no es un archivo de cabecera ya que no ".h". Esto se hizo para facilitar más de un tipo de paquetes en el archivo de cabecera. Hay posibilidades de que haya dos o más paquetes instalados en su sistema que contengan el código de iostream en él. "std" en "using namespace std" es uno de ellos. Lo que ocurre ahora es que para completar la adición de esta pieza extra de código de iostream necesitas añadir esta línea extra de código que determina qué paquete tiene que ser utilizado. La "directiva using" hace esto, es decir, usar el espacio de nombres std. El espacio de nombres es el nombre que se le da a los pequeños paquetes que los diferentes vendedores pueden producir para sus programas. Hay muchos paquetes como "std" disponibles. Y cuando no estás usando múltiples paquetes, entonces puedes simplemente poner la directiva using al principio para especificar qué paquete/espacio de nombres vas a usar en todo el programa para ahorrarte escribir std:: antes de cada línea de código.
Cuando se utiliza más de un paquete hay que escribir el código así →
std::cout("Este es el paquete std.");
asd::pick("pick() es una función del paquete asd.");
Espero que te haya servido de ayuda 🙂