为什么我要在generate_n函数中使用back_inserter ?
why should i use back_inserter in function generate_n?
嗨,伙计们,我将展示三个代码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");
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- C++ STL-Inserter
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- 链表回推操作中需要'back pointer'
- 为什么 std::string 的 back() 应该返回对字符的引用?
- VC++ 自动说明符假定矢量的引用限定符<bool>::back的引用限定符
- C: strtok value gives back null
- vector.back() 可以用来为向量的最后一个元素赋值吗?
- 在std::vector中实现back()
- 在push_front属性上有点混淆.intlist.push_front(2 * intlist.back())会做些
- 将对象转换为 char,然后"uncasting it back"