为什么我要在generate_n函数中使用back_inserter ?

why should i use back_inserter in function generate_n?

本文关键字:back inserter 函数 我要 generate 为什么      更新时间:2023-10-16

嗨,伙计们,我将展示三个代码1和2使相同的工作,但第三个不起作用。我想知道为什么不工作或者为什么其他两个工作?(字符串函数产生随机字符串)

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;
}

第三个具有未定义的行为。在第一种方法中,在定义向量的地方指定向量大小。这意味着它开始时是一个包含50个默认初始化(空)字符串的向量。然后用你的随机字符串覆盖这些字符串。

在第二个示例中,您使用back_insert_iterator将字符串分别添加到向量中。

在第三种情况中,从一个空向量开始,并尝试使用(无效的)迭代器到它的(不存在的)起点。然后写入20个字符串,从内存中它的(随机)初始值恰好指向的位置开始。但是,您没有在任何时候实际将字符串插入到vector中。vector通常会记录当前包含的元素数量;在第三种情况下,它将从0开始,一直保持0。当您试图显示"contents"时,应该什么也得不到(不过,因为此时已经有了未定义的行为,所以一切皆有可能——特别是如果您写入的一些数据恰好覆盖了vector的部分内部数据)。

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

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