[英]After using a transform to fill up a vector, the new c++11 for loop doesn't work
我目前正在學習STL,我正在研究映射,過濾等主題。我最近學到了很多新東西,比如新的c ++ 11 for loop(有auto)我(有點)不明白工作方式,但我想使用“transform”函數來填充另一個向量(映射主題)。 但是在我構建程序並運行它之后,它給了我一個錯誤:“無法尋找值初始化的矢量迭代器”
我不確定那意味着什么或有什么錯誤,你們能幫助我理解for循環概念以及我在這里做錯了什么?
ps最后“變換”的操作符是用一個lambda thingy(我仍然需要學習並且不知道)在教程中完成的,我試圖創建一個函數並猜測它會起作用。
int mult(int a) {
return a * 10;
}
int main() {
vector<int> v{ 1,2,3,4,5 };
vector<int> v1;
for (auto& i : v) {
cout << i << endl;
}
if (v1.empty()) cout << "v1 is empty" << endl;
cout << "v1" << endl;
transform(v.begin(), v.end(), v1.begin(), mult);
for (auto &i : v1) {
cout << i << endl;
}
}
transform
不會擴展范圍,它只會寫入假定為非空的現有范圍。 v1
為空,因此無法存儲轉換結果。 您可以選擇確保v1
包含足以覆蓋算法的元素:
vector<int> v1(v.size());
或者使用std::back_inserter
創建一個增加v1
大小的迭代器:
transform(v.begin(), v.end(), back_inserter(v1), mult);
這是UB(未定義的行為),它不會填充任何內容:
transform(v.begin(), v.end(), v1.begin(), mult);
你要:
std::transform(v.begin(), v.end(), std::back_inserter(v1), mult);
作為一般規則,對開始/結束迭代器的操作不會更改容器的大小。
你的代碼只是將數據寫入空緩沖區,破壞內存或更糟。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.