为什么#include "iostream" #include "string" #include "algorithm"都不加.h而加上就会出错呢?

#include "iostream"
#include "string"
#include "algorithm"
using namespace std;
bool IsSubstring (string s,string t)
{
    char *it;
    int i;
    int x=s.length();
    it=t.begin();
    for(i=0;i<x;i++)
    {
        it=(find(it,t.end(),s[i]));
        if(it==t.end())
            return false;
    }
    return true;
}
int main()
{
    string s,t;
    while(cin>>s>>t)
    {
        if(IsSubstring(s,t))
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}

简单来说iostream是c++头文件,iostream.h是c头文件。有些编译器不支持iostream.h,你的编译器属于这种

https://blog.csdn.net/LYKXHTP/article/details/88359043

因为你需要的那些文件名字中就没有.h这个后缀。加上.h没有这个文件就找不到;

.h只是规范约定的产物, 你也可以把一些定义的东西写在xxx.cpp然后include“xxx.cpp”都是没毛病的

简单说呢类似.h是vc 6.0时候的库文件。
新版没h后缀就是6.0以后的文件了。
这是主要的区别。

首先,5年前我们就开始反对把.h符号继续用在标准的头文件中。继续使用过时的规则可不是个好的方法。
从功能性的角度来讲,< iostream>包含了一系列模板化的I/O类,相反地只仅仅是支持字符 流。另外,输入输出流的C++标准规范接口在一些微妙的细节上都已改进,因此, < iostream>和< iostream.h>在接口和执行上都是不同的。最后,< iostream>的各组成都是以STL的形式声明的,然而< iostream.h>的各组成都是声明成全局型的。
因为这些实质上的不同,你不能在一个程序中混淆使用这两个库。做为一种习
惯,在新的代码中一般使用< iostream>,但如果你处理的是过去编写的代码,为了 继承可以用继续用< iostream.h>旧保持代码的一致性。

因为没有那个文件,include的东西是系统目录下的头文件,如果没定义当然会报错。
.h一般是c的头文件写法,c++为了区分都去掉了.h,有的include加不加.h都可以是因为两种文件都存在而且c++兼容c的库,但并不是说所有的都可以。
就像你不会把可执行文件的.exe去掉然后问为啥程序不能运行了。