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

时间:2011-10-01 23:50:34

标签: c++ stl

大家好我会展示三个代码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;
}

1 个答案:

答案 0 :(得分:4)

第三个有未定义的行为。在第一个中,指定定义矢量的矢量大小。这意味着它以50个默认初始化(空)字符串的向量开始。然后用随机字符串覆盖这些字符串。

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

在第三个中,您从一个空向量开始,并尝试将(无效)迭代器用于其(不存在)开头。然后从内存中的任意位置开始编写20个字符串,其(随机)初始值恰好引用。但是,您还没有在任何时候将字符串插入向量中。向量通常会计算当前包含的项目数;在你的第三种情况下,它将从0开始,并始终保持为0。当你试图显示“内容”时,你应该什么也得不到(尽管,因为你已经有了未定义的行为,所以一切皆有可能 - 特别是如果你写的一些数据碰巧覆盖了矢量内部的一部分数据

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

char *s;

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