string类与头⽂件iostreamstring
⼀般接触C++的时候,都会⽤到string这个标准程序库提供的类型。需要包含对应的头⽂件。
在不同的平台,头⽂件include的内容有时候也不⼀样。像string类型,有时候我们只#include iostream但不#include string⼀样可以编译通过。c++string类型
查了⼀下,结论就是总是包含适当的头⽂件。
STL编程的次要⿇烦之⼀是虽然可以很容易地建⽴可以在⼀个平台上编译的软件,但在其它平台上则需要附加的#include指⽰。这个烦恼来⾃⼀个事实:C++标准(不像C标准)未能指定哪⼀个标准头⽂件必须或者可能被其他标准头⽂件#include。由于有了这样的灵活性,不同的实现就会选择去做不同的东西。
这在实践中意味着什么?我可以给你⼀些的概念。我使⽤了五个STL平台(咱们叫它们A、B、C、D和E),花了⼀些时间在它们上测试了⼀些⼩程序来看看我可以在忽略哪个标准头⽂件的情况下仍然成功编译。这间接地告诉我哪个头⽂件#include了其他的。这是我所发现的:
* 对于A和C,<vector> #includes <string>.
* 对于C,<algorithm> #includes <string>.
* 对于C和D, <iostream> #includes <iterator>.
* 对于D, <iostream> #includes <string> and <vector>.
* 对于D和E, <string> #includes <algorithm>.
* 对于所有的五个实现,<set> #includes <functional>.
除了<set> #include <functional>外,我⽆法使缺少头⽂件的程序通过实现B。按照Murphy定律,你总是会在像A、C、D或E那样的平台上开发,然后移植到像B那样的平台,尤其是当移植的压⼒很⼤⽽且完成的时间很紧的情况下。
但是请别指责你将要移植的编译器或库实现。如果你缺少了需要的头⽂件,这就是你的过错。⽆论何时你引⽤了std名字空间⾥的元素,你就应该对 #include合适的头⽂件负责。如果你遗漏了它们,你的代码也可能编译,但你仍然缺少了必要的头⽂件,⽽其他STL平台可能正好会抵制你的代码。
要帮你记起需要的东西,关于在每个标准STL相关的头⽂件中都有什么,这⾥有⼀个快速概要:
* ⼏乎所有的容器都在同名的头⽂件⾥,⽐如,vector在<vector>中声明,list在< list>中声明等。例外的是<set>和<map>。<set>声明了set 和multiset,< map>声明了map和multimap。
* 除了四个算法外,所有的算法都在<algorithm>中声明。例外的是accumulate(参见条款37)、inner_product、adjacent_difference和partial_sum。这些算法在<numeric>中声明。
* 特殊的迭代器,包括istream_iterators和istreambuf_iterators(参见条款29),在<iterator>中声明。
* 标准仿函数(⽐如less<T>)和仿函数适配器(⽐如not1、bind2nd)在<functional>中声明。
⽆论何时你使⽤了⼀个头⽂件中的任意组件,就要确定提供了相应的#include指⽰,就算你的开发平台允许你不⽤它也能通过编译。当你发现移植到⼀个不同的平台时这么做可以减少压⼒,你的勤奋将因⽽得到回报。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。