我最近正在学习标准库算法,对于函数fill_n(iter, n, val)
有一个问题。这个函数要求容器从iter
开始至少有n
个元素。
这是测试代码:
// Version 1, Error
vector<int> vec;
vec.reserve(10); // Only allocate space for at least 10 elements
fill_n(vec.begin(), 10, 0);
// Version 2, OK
vector<int> vec;
vec.resize(10); // Value initialized 10 elements
fill_n(vec.begin(), 10, 0);
// Version 3, OK
vector<int> vec;
fill_n(back_inserter(vec), 10, 0); // Push back 10 elements via back_inserter
为什么版本1的代码出错,而版本2和3没有出错?
back_inserter
不会因为前面语句中的reserve
调用而导致重新分配。当然,对于vec
的任何进一步插入、push_back等操作可能会导致重新分配。 - Andre Kostur