面试题答案
一键面试1. 内存分配
vector
在内部使用动态数组来存储元素。当创建一个vector
对象时,它会在堆上分配一块连续的内存空间来存储元素。例如:
std::vector<int> vec;
这里vec
在初始时分配了足以容纳0个元素的内存(实际可能有少量额外开销)。
2. 增长策略
- 初始容量:
vector
的初始容量(capacity
)可能为0,随着元素的插入,它会根据需要增加容量。 - 容量增长方式:当
vector
的size
(当前存储的元素个数)达到capacity
(当前分配的内存可容纳的最大元素个数)时,vector
会重新分配内存。通常新的容量是原容量的两倍(不同编译器实现可能略有差异)。例如:
std::vector<int> vec;
for(int i = 0; i < 10; ++i) {
vec.push_back(i);
}
这里随着元素不断插入,当容量不足时会重新分配内存并将旧元素复制到新内存。
3. 释放机制
- 析构:当
vector
对象被销毁(例如超出作用域)时,它会自动释放其占用的内存。vector
的析构函数会先调用每个元素的析构函数(如果元素是类类型),然后释放存储元素的动态数组的内存。 clear
与shrink_to_fit
:clear
函数只是将size
置为0,并不会释放内存,元素的析构函数会被调用。而shrink_to_fit
尝试减少容量以匹配当前size
,但这只是一个请求,不同编译器实现可能不同,不一定能完全达到释放多余内存的效果。例如:
std::vector<int> vec{1, 2, 3};
vec.clear(); // size变为0,但容量可能不变
vec.shrink_to_fit(); // 尝试减少容量到size大小
4. 导致内存重新分配的情况
push_back
:当size
达到capacity
时,调用push_back
添加新元素会导致内存重新分配。例如:
std::vector<int> vec;
for(int i = 0; i < 10; ++i) {
std::cout << "size: " << vec.size() << ", capacity: " << vec.capacity() << std::endl;
vec.push_back(i);
}
每次容量不足时,vector
会重新分配内存,容量一般变为原来的两倍。
insert
:在vector
中间插入元素时,如果当前容量不足,也会导致内存重新分配。例如:
std::vector<int> vec{1, 2, 3};
vec.insert(vec.begin() + 1, 10); // 如果容量不足,会重新分配内存
resize
:如果resize
后的大小超过当前容量,会导致内存重新分配。例如:
std::vector<int> vec{1, 2, 3};
vec.resize(10); // 如果原容量小于10,会重新分配内存