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