根据此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>
标题?
答案 0 :(得分:6)
您在此处使用的<vector>
的具体实现可能包括copy
和swap
的定义(可能包括<algorithm>
,或者可能包含其他一些私有包含它们的标头),但这只是一个实现细节,并不保证是可移植的。如果您要切换编译器,完全有可能最终使用C ++标准库的实现,其中copy
和swap
未被<vector>
导入,在这种情况下你的代码将不再编译。
换句话说,仅仅因为它恰好适用于您的编译器并不意味着它是可移植的,因此为了获得最大的可移植性和正确性,您应该包括<algorithm>
。
希望这有帮助!
答案 1 :(得分:1)
“由<vector>
导出”......
在C ++中,事情不是导出。
但是,<vector>
被允许#include <algorithm>
,这意味着当您使用<algorithm>
时,您可以访问所有<vector>
。但为了安全起见,您仍然应该#include <algorithm>
自己,因为不同的实现(甚至是不同的版本)可能不会这样做,如果您不自己包含它,它可能会破坏您的代码。
答案 2 :(得分:0)
Clang标准C ++库中<vector>
的实现包括<algorithm>
。值得注意的是,std::vector<T>
有一个swap()
方法,所以这可能是一个线索。
请记住<algorithm>
中的算法在很多情况下都适用于迭代器,并且指针通常可以互换。使用非STL容器的数据结构中包含的算法是完全可行的。