C++中vector调用push_back()后size从10变为20的原因
问题根因
你对vector构造函数的行为、size()接口的语义存在误解,错把构造时传入的整数参数当成了预分配容量,实际上这个参数代表初始生成的元素个数。
size()的返回值是vector当前实际存储的元素总数,对应预分配内存可容纳的最大元素数是capacity(),二者不要混淆。- 代码中
vector<string> StrVec(10)调用的是vector的计数构造函数,执行后会直接在容器内生成10个默认构造的空string元素,此时容器内本来就有10个元素,第一次打印size()得到10完全符合逻辑。 - 后续循环中你连续调用10次
push_back(),该接口的作用是在容器尾部追加新元素,不会覆盖原有位置的内容,相当于在原本10个元素的基础上新增了10个,最终元素总数为20,因此第二次打印size()返回20。
正确写法参考
如果你的预期是「初始时容器内没有元素,仅预分配足够存放10个元素的内存,避免push_back时频繁扩容」,需要用reserve()接口预留空间,而非在构造函数中直接传入元素个数:
int main() { vector<string> StrVec; StrVec.reserve(10); // 预分配容量,此时size()为0,capacity()为10 vector<int> intVec(10); iota(intVec.begin(), intVec.end(), 1); cout << "StrVec.length = " << StrVec.size() << endl; // 输出0 for (int i : intVec) { StrVec.push_back(to_string(i)); } cout << "StrVec.length = " << StrVec.size() << endl; // 输出10 return 0; }
如果你的预期是「初始构造10个元素位置,后续直接替换这些位置的内容,不新增元素」,应该使用下标赋值而非push_back():
for (int idx = 0; idx < intVec.size(); idx++) { StrVec[idx] = to_string(intVec[idx]); }
执行完上述代码后StrVec.size()会保持10不变。
内容的提问来源于stack exchange,提问作者kaytu
相关产品推荐
相关产品推荐

