c vector resize
时间: 2023-08-19 14:06:09 浏览: 137
vector resize 和 reserve 是 STL 中 vector 的两个常用函数。
resize 函数是用来改变 vector 的大小的,如果新的大小大于原来的大小,那么会在 vector 后面增加一些元素,而这些新增的元素的值是未定义的。
reserve 函数是用来预留 vector 的容量的,如果 reserve 的参数大于 vector 的当前容量,那么 vector 的容量会增加到参数值,但是 vector 的大小并不会发生改变。
两个函数有什么区别? resize 会改变 vector 的大小,而 reserve 只是预留容量,不改变 vector 的大小。
相关问题
c++ vector.resize
C++的vector类提供了多种重载的resize()函数来改变向量的大小。根据引用,resize()函数有两种版本:
1. `void resize(size_type n)`:此版本将向量的大小改变为n。如果n小于当前向量的大小,则会截断超出n的元素。如果n大于当前向量的大小,则会在末尾插入默认构造的元素。这种版本不会为新元素赋值。
2. `void resize(size_type n, const value_type& val)`:此版本将向量的大小改变为n。如果n小于当前向量的大小,则会截断超出n的元素。如果n大于当前向量的大小,则会在末尾插入val值的元素。这种版本会为新元素赋值为val。
根据引用,还有另一种版本:
3. `void resize(size_type n, value_type val = value_type())`:此版本与第二种版本相同,但是在没有提供val参数时,默认使用元素类型的默认构造函数来为新元素赋值。
所以,c vector.resize(n)将改变向量的大小为n,不会为新元素赋值;c vector.resize(n, val)将改变向量的大小为n,并将新元素赋值为val;c vector.resize(n, val)将改变向量的大小为n,并将新元素赋值为val(如果未提供val,则使用元素类型的默认构造函数来赋值)。
c语言中类似vector的功能
在C语言中,并没有内置像Vector那样可以直接存储一组动态大小元素的数据结构,不过你可以通过数组或者链表等基础数据结构来模拟实现类似功能。以下是两种常见的实现方式:
1. 数组实现:
- **动态数组**:可以预先设定一个最大容量,然后通过指针和递增操作来添加或删除元素,如`struct Vector`:
```c
typedef struct {
int* data; // 数据地址
size_t size; // 当前元素数
size_t capacity; // 最大容量
} Vector;
void resize(Vector* vec, size_t new_capacity) {
if (new_capacity > vec->capacity) {
vec->data = realloc(vec->data, sizeof(int) * new_capacity);
vec->capacity = new_capacity;
}
}
void push_back(Vector* vec, int value) {
if (vec->size == vec->capacity) resize(vec, vec->capacity * 2); // 动态扩容
vec->data[vec->size++] = value;
}
```
2. 链表实现:
- **动态链表**:链表节点包含一个整数值和指向下一个节点的指针,可以根据需要随时添加新节点:
```c
typedef struct Node {
int value;
struct Node* next;
} Node;
struct List {
Node* head;
size_t size;
};
void list_push_back(List* list, int value) {
Node* newNode = malloc(sizeof(Node));
newNode->value = value;
newNode->next = list->head;
list->head = newNode;
list->size++;
}
```
这两种方式都有其优缺点,动态数组适合插入和访问元素频繁的情况,而链表更适合插入和删除元素频繁且不需要随机访问的情况下。
阅读全文