【发布时间】:2014-01-05 22:15:29
【问题描述】:
根据此cplusplus.com 页面,std::copy 位于 <algorithm> 标头中,std::swap 也是如此,但这是有效的:
#include <iostream> // std::cout
#include <vector> // std::vector
#include <iterator> // std::ostream_iterator()
#include <cstdlib> // rand(), srand()
// NOT including <algorithm>
int main()
{
srand(time(NULL));
const int SIZE = 10;
std::vector<int> vec;
for(int i = 0; i < SIZE; ++i)
{
vec.push_back(rand() % 256);
}
copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
}
我唯一能想到的是它们也是由<vector> 导出的...但是为什么我们需要<algorithm> 标头呢?
【问题讨论】:
-
<algorithm>(以及 C++11 中的<utility>和std::swap)是需要的。其他标题可能包含它们,但您不能依赖它。 -
至少,你不应该依赖它。但是,是的,看看你的其他包括。他们正在拉入
<algorithm>。 -
相关无意义的琐事:虽然 C++ 标准允许一个标准头包含另一个标准头,但 C 标准不允许这样做。
-
@MichaelBurr:这是否意味着如果标准头文件使用
NULL,它必须定义它(在头文件中)而不是包含stddef.h/stdlib.h/etc?并且它必须从其他头文件中转发声明所需的函数而不是包含那些头文件?还是比这更严格? -
@Cornstalks:在 C 中,标准标头通常不需要使用
NULL的定义;有七个标题需要定义它。与函数的前向声明类似 - 标题中不需要这些(据我所知)。一些类型定义,如size_t,在多个头文件中声明;当用户包含多个标题时,实现通常会使用具有保留名称的宏来防止重新声明 typedef。