Visual Studio 2010 Beta 1 發布一週,VC++ 標準庫開發者 Stephan T. Lavavej 曝光數個**可能導致既有代碼編譯失敗**的 STL 變更。升級前必讀!
back_inserter 找不到識別項VC9 (VS2008 SP1) 編譯通過的代碼,VC10 (VS2010 Beta 1) 報錯:
error C3861: 'back_inserter': identifier not found
#include
#include
#include
#include
using namespace std;
int square(int n) { return n * n; }
int main() {
vector v = {11, 22, 33};
vector dest;
transform(v.begin(), v.end(), back_inserter(dest), square); // 錯誤行
for (auto i : dest) cout << i << endl;
}
<algorithm> 內部包含了 <iterator>,順帶引入 back_inserter。<algorithm> 不再包含 <iterator>**。
#include // 明確包含 back_inserter 所在標頭
鐵律:使用標準庫元件,**必須包含標準規定的對應標頭檔**,不可依賴實作細節的間接包含。這樣代碼才具可攜性、免疫版本變更。
對 vector/deque/list,勿用 copy + back_inserter:
// 糟糕:逐次 push_back 可能觸發多次重新分配
copy(first, last, back_inserter(vec));
// 好:範圍插入,一次配置足夠空間
vec.insert(vec.end(), first, last);
// 僅建構容器時:範圍建構子
vector seq(first, last);
範圍插入/建構利用前向迭代器可預知元素數量,**一次性配置記憶體,效能顯著優於逐次 push_back**。
<iterator> 只是最常見的受害者。Visual Studio 2010 Beta 1 is now available for download... by Stephan T. Lavavej