繁体   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