c++中vector扩容
时间: 2023-12-12 21:35:47 浏览: 41
在C++中,vector是一种非常常用的容器,它可以自动扩容以容纳更多的元素。当vector中的元素数量超过其当前容量时,vector会自动分配更多的内存来容纳更多的元素。vector的扩容过程可以通过以下步骤来实现:
1. 当vector中的元素数量超过其当前容量时,vector会分配一个新的内存块来存储更多的元素。
2. 然后,vector会将当前元素的值复制到新的内存块中。
3. 最后,vector会释放旧的内存块,并将指向旧内存块的指针更新为指向新的内存块。
以下是一个简单的示例,演示了如何使用vector来添加元素并自动扩容:
```c++
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
// 添加元素
for (int i = 0; i < 10; i++) {
vec.push_back(i);
std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;
}
return 0;
}
```
在上面的示例中,我们创建了一个空的vector,并使用push_back()函数向其中添加了10个元素。每次添加元素时,我们都打印出vector的大小和容量。由于vector会自动扩容,因此我们可以看到容量随着元素数量的增加而增加。
相关问题
c++ vector扩容机制
C++中的vector是一种动态数组,它可以根据需要自动扩容。当vector中的元素数量超过当前容量时,vector会重新分配一块更大的内存空间,并将原有元素复制到新的内存空间中。vector的扩容机制可以通过reserve()和capacity()函数来观察和控制。
以下是一个示例代码,演示了vector的扩容机制:
```c++
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
std::cout << "Initial capacity: " << vec.capacity() << std::endl; // 输出:Initial capacity: 0
for (int i = 0; i < 10; i++) {
vec.push_back(i);
std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;
}
// 输出:
// Size: 1, Capacity: 1
// Size: 2, Capacity: 2
// Size: 3, Capacity: 4
// Size: 4, Capacity: 4
// Size: 5, Capacity: 8
// Size: 6, Capacity: 8
// Size: 7, Capacity: 8
// Size: 8, Capacity: 8
// Size: 9, Capacity: 16
// Size: 10, Capacity: 16
vec.reserve(20);
std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl; // 输出:Size: 10, Capacity: 20
return 0;
}
```
在上面的代码中,我们首先创建了一个空的vector,并输出了它的初始容量。然后我们通过push_back()函数向vector中添加元素,每次添加一个元素后,都输出当前vector的大小和容量。可以看到,当vector的大小超过当前容量时,vector会自动扩容,容量扩大的规则是:如果当前容量不足以容纳新元素,则将容量扩大为原来的两倍。最后,我们使用reserve()函数将vector的容量设置为20,并输出了当前vector的大小和容量。
C++ Vector 怎么扩容?
在 C 语言中,如果我们使用动态数组实现 Vector,需要考虑到扩容的问题。下面是一种实现方式:
1. 定义结构体 `vector`,包含以下成员:
```c
typedef struct {
int *data;
int size;
int capacity;
} vector;
```
其中,`data` 指向动态数组的首地址,`size` 表示当前数组中元素的个数,`capacity` 表示数组的容量。
2. 实现初始化函数 `init_vector`,用于初始化一个 vector:
```c
void init_vector(vector *v) {
v->data = (int *)malloc(sizeof(int) * INIT_CAPACITY);
v->size = 0;
v->capacity = INIT_CAPACITY;
}
```
其中,`INIT_CAPACITY` 是一个预定义的常量,表示数组的初始容量。
3. 实现添加元素函数 `push_back`,用于在数组的末尾添加一个元素:
```c
void push_back(vector *v, int value) {
if (v->size == v->capacity) {
v->capacity *= 2;
v->data = (int *)realloc(v->data, sizeof(int) * v->capacity);
}
v->data[v->size++] = value;
}
```
如果数组已满,就将容量扩大一倍,并使用 `realloc` 函数重新分配内存。然后,在数组末尾添加新的元素。
需要注意的是,`realloc` 函数可能会返回空指针,因此在使用之前需要进行判断。
4. 实现释放函数 `free_vector`,用于释放动态数组占用的内存:
```c
void free_vector(vector *v) {
free(v->data);
v->size = 0;
v->capacity = 0;
}
```
这样,我们就实现了一个简单的动态数组 Vector,并且实现了扩容的功能。