大家好我会展示三个代码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;
}
答案 0 :(得分:4)
第三个有未定义的行为。在第一个中,指定定义矢量的矢量大小。这意味着它以50个默认初始化(空)字符串的向量开始。然后用随机字符串覆盖这些字符串。
在第二个中,您使用back_insert_iterator
将字符串分别添加到矢量中。
在第三个中,您从一个空向量开始,并尝试将(无效)迭代器用于其(不存在)开头。然后从内存中的任意位置开始编写20个字符串,其(随机)初始值恰好引用。但是,您还没有在任何时候将字符串插入向量中。向量通常会计算当前包含的项目数;在你的第三种情况下,它将从0开始,并始终保持为0。当你试图显示“内容”时,你应该什么也得不到(尽管,因为你已经有了未定义的行为,所以一切皆有可能 - 特别是如果你写的一些数据碰巧覆盖了矢量内部的一部分数据
你所拥有的是一个稍微更微妙(但同样有问题)的知名初学者错误版本,如:
char *s;
strcpy(s, "This will give UB");