VC++10では<iterator>をインクルードする必要がある

Visual C++ Team Blog - STL Breaking Changes in Visual Studio 2010 Beta 1


VC++10では、STLに破壊的な変更が行われるそうです。
(C++0xには関係ない変更。Microsoftが破壊的な変更なんてめずらしい…。)


以下のコードは、VC++9 SP1まではコンパイルが通りますが、VC++10ではエラーになります。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<int> v;

    v.push_back(3);
    v.push_back(1);
    v.push_back(4);

    copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));
        // VC9  : OK
        // VC10 : エラー!ostream_iteratorが定義されていません
}

VC++10では、ostream_iteratorやback_inserter等を使用するために
iterator>をインクルードする必要があります。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator> // 追加

using namespace std;

int main()
{
    vector<int> v;

    v.push_back(3);
    v.push_back(1);
    v.push_back(4);

    copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));
        // VC9  : OK
        // VC10 : OK
}

VC++9までは、<iterator>が<algorithm>内でインクルードされてしまう(バグではない)ため
GCCのような他のコンパイラに持っていったときにエラーになることが多かったので
個人的にはうれしい変更です。