gpt4 book ai didi

c++ - 为什么我应该在函数 generate_n 中使用 back_inserter?

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:00 25 4
gpt4 key购买 nike

大家好,我将展示三个代码 1 和 2 可以正常工作,但第三个不起作用。我想了解为什么不起作用或为什么其他两个起作用? (strrand 函数产生随机字符串)

1.

int main(){
vector<string> svec(50);
randomize();

generate_n(svec.begin(), 20, strrand);
display(svec.begin(), svec.end());

return 0;
}

2.

int main() {
vector<string> svec;
randomize();

generate_n(back_inserter(svec), 20, strrand);
display(svec.begin(), svec.end());

return 0;
}

3.

int main(){
vector<string> svec;
randomize();

generate_n(svec.begin(), 20, strrand);
display(svec.begin(), svec.end());

return 0;
}

最佳答案

第三个具有未定义的行为。首先,您在定义 vector 的位置指定 vector 大小。这意味着它以 50 个默认初始化(空)字符串的 vector 开始。然后用您的随机字符串覆盖这些字符串。

在第二种情况下,您使用 back_insert_iterator 将字符串分别添加到 vector 中。

在第三种情况下,您从一个空 vector 开始,并尝试使用(无效的)迭代器到它的(不存在的)开头。然后,您从内存中其(随机)初始值恰好指向的任何位置开始写入 20 个字符串。但是,您实际上并没有在任何时候将字符串插入到 vector 中。 vector 通常会记录它当前包含的项目数量;在您的第三种情况下,它将从 0 开始,并且始终保持为 0。当您尝试显示“内容”时,您应该什么也得不到(但是,由于此时您已经有未定义的行为,所以一切皆有可能——尤其是当您编写的某些数据碰巧覆盖了 vector 内部的一部分时数据。

你所拥有的是众所周知的初学者错误的稍微更微妙(但同样有问题)的版本,例如:

char *s;

strcpy(s, "This will give UB");

关于c++ - 为什么我应该在函数 generate_n 中使用 back_inserter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com