为何提前指定大小的vector无法用push_back插入元素?
为啥你的vector::push_back没按预期工作?
嘿,咱们来一步步拆解你的代码问题,搞清楚到底发生了啥:
首先,vector初始化的坑
你写的vector<char> v(5);这行代码,可不是创建一个“能装5个元素的空vector”哦——它会直接生成一个包含5个默认初始化char元素的vector,这些元素的值是'\0'(也就是空字符,在控制台输出的时候是看不到的)。
然后是循环条件的致命问题
你的循环条件是for (int i = 0; i < v.size(); ++i),但每次调用push_back都会让v.size()增加1!这意味着这个循环会无限跑下去——i在涨,v的大小也跟着涨,永远达不到退出条件。
你之所以觉得“push_back没插入值”,大概率是因为:
- 程序还没输出到你插入的字符就因为无限循环卡住了;
- 就算能输出,前面5个
'\0'是不可见的,你可能以为没东西输出。
两种正确的写法,按需选
写法一:空vector + 固定次数push_back
如果你就是想用push_back追加元素,那先创建空vector,然后固定循环5次就行:
int main (){ vector<char> v; // 空vector,初始没有元素 char x = 'a'; for (int i = 0; i < 5; ++i) { // 明确循环5次,不依赖v.size() v.push_back(x); ++x; } for (int i = 0; i < v.size(); ++i) cout << v[i]; // 这里会输出abcde keep_window_open(); return 0; }
写法二:初始化指定大小后直接赋值
如果你一开始就确定要存5个元素,那直接给已有元素赋值就行,不用push_back(它是追加元素,会让vector变大):
int main (){ vector<char> v(5); // 初始就有5个元素 char x = 'a'; for (int i = 0; i < v.size(); ++i) { v[i] = x; // 直接覆盖已有元素的值 ++x; } for (int i = 0; i < v.size(); ++i) cout << v[i]; // 同样输出abcde keep_window_open(); return 0; }
额外小提示
push_back的核心作用是在vector尾部添加新元素,会让vector的size+1,绝对不是替换已有元素;- 如果想提前给vector预留空间(避免频繁扩容影响效率),可以用
reserve:比如vector<char> v; v.reserve(5);,这时候vector还是空的,但已经预留了装5个元素的空间,之后push_back会更高效。
内容的提问来源于stack exchange,提问作者dino2018
相关产品推荐
相关产品推荐

