C++中的#include"std_lib_facilities.h是什么意思?在c++之父的新书里看到的,为什么不能编译?

这个头文件在他的主页上有一个源文件。您需要自己用这个名称创建一个新的头文件,并将内容复制到其中。

代码如下:

//将文件命名为:std_lib_facilities.h,然后将其添加到您的项目中。

/*

简单的“编程:使用C++的原理和实践”课程标题

最初几周使用。

它提供了最常见的标准头(在全局名称空间中)

和最小的异常/错误支持。

学生:请不要试图理解标题的细节。

一切都会得到解释。这个头主要是用来让你没有

一次理解所有的概念。

修订日期2010: simple_error()已添加

*/

#ifndef H112

#定义H112 201004L

# include & ltiostream & gt

# include & ltfstream & gt

# include & ltsstream & gt

# include & ltcmath & gt

# include & ltcstdlib & gt

# include & lt字符串& gt

# include & lt列表& gt

# include & ltvector & gt

# include & lt算法& gt

# include & ltstdexcept & gt

// -

# VER国际金融中心

# include & lthash _ map & gt

使用stdext::hash _ map;

#否则

# include & ltext/hash _ map & gt;

使用_ _ GNU _ cxx::hash _ map;

名称空间__gnu_cxx {

模板& lt& gt结构哈希& ltSTD::string & gt;

{

size_t运算符()(const STD::string & amp;s)常数

{

返回散列值& ltchar * & gt(( s . c _ str());

}

};

} //名称空间__gnu_cxx的

#endif

// -

#定义无序映射散列映射

// -

typedef长Unicode

// -

使用命名空间std

模板& ltT类& gt字符串到字符串(常量T & ampt)

{

ostringstream os

os & lt& ltt;

返回OS . str();

}

struct Range _ error:out _ of _ Range {//增强向量范围错误报告

int索引;

Range _ error(int I):out _ of _ Range(" Range error:"+to _ string(I)),index(i) { }

};

//普通范围检查向量(无迭代器检查):

模板& ltT类& gt结构向量:public STD::Vector & lt;T & gt{

typedef typename std::vector<T & gt*尺寸类型尺寸类型;

Vector() { }

显式Vector(size _ type n):STD::Vector & lt;T & gt(n) {}

向量(size_type n,const T & ampv):STD::vector & lt;T & gt(n,v) {}

模板& lt一级& gt

Vector(我先,我后):STD::vector & lt;T & gt(名字,姓氏){}

T & ampoperator[](unsigned int i) //而不是在(I)返回;

{

如果(我& lt0 | | this-& gt;size()& lt;= I)throw Range _ error(I);

返回STD::vector & lt;T & gt*经营者[](一);

}

const T & amp运算符[](无符号整数I)常量

{

如果(我& lt0 | | this-& gt;size()& lt;= I)throw Range _ error(I);

返回STD::vector & lt;T & gt*经营者[](一);

}

};

//恶心的宏hack获取一个范围检查向量:

#定义向量向量

//普通范围检查字符串(无迭代器检查):

结构字符串:std::string {

String() { }

string(const char * p):STD::string(p){ }

字符串(常量字符串& amps):STD::string { }

模板& lt类别S & gt字符串:STD::string { }

String(int sz,char val) :std::string(sz,val) {}

模板& ltIter类& gtString(Iter p1,Iter p2) : std::string(p1,p2) { }

char & ampoperator[](unsigned int i) //而不是在(I)返回;

{

如果(我& lt0 | | size()& lt;= I)throw Range _ error(I);

return STD::string::operator[](I);

}

常数字符和。运算符[](无符号整数I)常量

{

如果(我& lt0 | | size()& lt;= I)throw Range _ error(I);

return STD::string::operator[](I);

}

};

#ifndef _MSC_VER

名称空间__gnu_cxx {

模板& lt& gt结构哈希& lt字符串& gt

{

size_t运算符()(常量字符串& amps)常数

{

返回散列值& ltSTD::string & gt;()(s);

}

};

} //名称空间__gnu_cxx的

#endif

结构退出:runtime_error {

Exit(): runtime_error("Exit") {}

};

// error()只是伪装抛出:

内联void错误(常量字符串& amps)

{

抛出运行时错误;

}

内联void错误(常量字符串& amps,常量字符串& amps2)

{

误差(s+S2);

}

内联void错误(常量字符串& amps,int i)

{

ostringstream os

os & lt& lts & lt& lt":" & lt& lt我;

error(OS . str());

}

# if _ MSC _ VER & lt;1500

//恶心的宏hack来获取范围检查字符串:

#定义字符串string

// MS C++ 9.0有一个用于字符串范围检查的内置断言

//并在几个地方使用“std::string ”,因此宏替换失败

#endif

模板& ltT类& gtchar * as _ bytes(T & amp;i) //二进制I/O所需

{

地址= & amp我;//获取第一个字节的地址

//用于存储对象的内存

返回static _ cast & ltchar * & gt(addr);//将内存视为字节

}

inline void keep_window_open()

{

CIN . clear();

cout & lt& lt”请输入一个字符以退出\ n”;

char ch

CIN & gt;& gtch;

返回;

}

内联void keep_window_open(字符串s)

{

if (s== " ")返回;

CIN . clear();

cin.ignore(120,' \ n ');

for(;;) {

cout & lt& lt“请输入”& lt& lts & lt& lt”退出\ n”;

字符串ss;

而(CIN & gt;& gtss & amp& ampss!=s)

cout & lt& lt“请输入”& lt& lts & lt& lt”退出\ n”;

返回;

}

}

//在第5章引入error()之前(仅)使用的error函数:

inline void simple _ error(string s)//write ` ` error:s?并退出程序

{

cerr & lt& lt错误:“& lt& lts & lt& lt\ n ';

keep_window_open()。//对于某些Windows环境

退出(1);

}

//使std::min()和std::max()可访问:

#最小

#最大值

# include & ltiomanip & gt

内嵌ios _ base & amp常规(ios _ base & ampb) //增强固定性和科学性

{

b.setf(ios_base::fmtflags(0),IOs _ base::float field);

返回b;

}

//运行时检查收缩转换(类型转换):

模板& ltR级,A级& gt窄播(常数A & amp答

{

R R = R(a);

if (A(r)!=a)错误(字符串(" info loss "));

return r;

}

inline int randint(int max){ return rand()% max;}

inline int randint(int min,int max){ return randint(max-min)+min;}

inline double sqrt(int x){ return sqrt(double(x));} //匹配C++0x

#endif