为什么std :: copy或std :: swap?</algorithm>不需要<algorithm>

时间:2014-01-05 22:15:30

标签: c++ algorithm stl

根据此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>标题?

3 个答案:

答案 0 :(得分:6)

您在此处使用的<vector>的具体实现可能包括copyswap的定义(可能包括<algorithm>,或者可能包含其他一些私有包含它们的标头),但这只是一个实现细节,并不保证是可移植的。如果您要切换编译器,完全有可能最终使用C ++标准库的实现,其中copyswap未被<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容器的数据结构中包含的算法是完全可行的。