簡體   English   中英

使用變換填充向量后,新的c ++ 11 for循環不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM