C++STL详解之vector

在C++中,vector是标准库提供的一个非常有用的容器类。它是一个动态数组,可以根据需要动态调整大小。它提供了方便的方法来管理和访问动态数组的元素。

目录

一、调用

二、使用

1、.size()函数

2、插入函数

Ⅰ、.push_back()

Ⅱ、.insert()

3、vector的遍历以及输出

Ⅰ、下标遍历

Ⅱ、迭代器遍历

①正向遍历

②反向遍历

4、删除函数

Ⅰ、erase()

Ⅱ、pop_back()

三、总结


一、调用

使用vector时,你需要包含头文件< vector >。然后你可以使用vector模板类来创建一个vector对象,指定其中存储的元素类型。

例如,你可以创建一个vector对象来存储整数:

​
​
#include<vector>
#include<iostream>
using namespace std;
int main()
    vector<int> v;
}

​

​

定义一个空vector,其值为int类型。vector<>的里面可以套int、char、string,包括用struct定义的类型(没听过struct请忽略)甚至vector自己。

二、使用

1、.size()函数

vector的size()函数是用来返回vector容器中元素的个数的。它的语法为:

size_type size() const;

其中,size_type是vector容器中元素个数的数据类型。

示例用法:

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> v={1,2,3,4,5};
    cout<<"大小为"<<v.size()<<endl;
	return 0;
}

上述示例中,通过size()函数获取到了vector容器中元素的个数,并将结果输出到屏幕上。

输出为:

2、插入函数

Ⅰ、.push_back()

vector的.push_back函数是用来在vector的末尾添加一个元素的。它的语法为:

void push_back(const T& value);

其中,T是vector存储的元素类型,value是要添加的元素。

该函数会将value的副本添加到vector的末尾。如果vector的容量已满,则会自动进行内存扩展。

示例用法:

#include<vector>
#include<iostream>
using namespace std;
int main() {
    vector<int> v;
    v.push_back(1); // 添加元素1
    v.push_back(2); // 添加元素2
    v.push_back(3); // 添加元素3
    return 0;
}

在上述示例中,通过.push_back函数分别添加了元素1、2、3到v中。最终,v的元素是[1, 2, 3]。

Ⅱ、.insert()

C++

### C语言VECTOR 的使用方法 尽管标准C语言并未直接提供 `VECTOR` 这一数据结构,但可以通过自定义的方式实现类似功能。以下详细介绍如何在C语言中设计和使用动态数组(即 `VECTOR`),并结合具体代码示例说明其操作。 --- #### 1. **动态数组的设计** 动态数组的核心在于能够根据需求自动扩展或缩减容量。以下是基于引用的内容所描述的 `VECTOR` 结构[^3]: ```c #ifndef VECTOR_H #define VECTOR_H // 默认初始容量 #define DEFAULT_CAPACITY 10 // 当数组长度超过此阈值时,按一定比例扩容 #define HIGH_SIZE 1024 // 存储的数据类型(此处以字符串为例) typedef char* Element; // 定义动态数组结构 typedef struct vector_s { Element* data; // 动态数组指针 int size; // 当前有效元素数量 int capacity; // 总容量 } Vector; #endif ``` --- #### 2. **核心接口函数** ##### (1)**创建动态数组** 初始化一个空的动态数组,分配默认容量的内存。 ```c #include <stdlib.h> #include <string.h> Vector* vector_create() { Vector* v = (Vector*)malloc(sizeof(Vector)); if (!v) return NULL; v->data = (Element*)malloc(DEFAULT_CAPACITY * sizeof(Element)); if (!v->data) { free(v); return NULL; } v->size = 0; v->capacity = DEFAULT_CAPACITY; return v; } ``` ##### (2)**销毁动态数组** 释放动态数组占用的所有内存资源。 ```c void vector_destroy(Vector* v) { if (!v) return; free(v->data); free(v); } ``` ##### (3)**向末尾追加元素** 如果当前容量不足,则先进行扩容再插入新元素。 ```c static void resize(Vector* v) { if (v->size >= v->capacity) { int new_capacity = (v->capacity > HIGH_SIZE) ? v->capacity + v->capacity / 2 : v->capacity * 2; v->data = realloc(v->data, new_capacity * sizeof(Element)); if (!v->data) exit(-1); v->capacity = new_capacity; } } void vector_push_back(Vector* v, Element val) { if (!v || !val) return; resize(v); v->data[v->size++] = strdup(val); // 深拷贝字符串 } ``` ##### (4)**向前端插入元素** 前端插入需要移动已有元素,并可能触发扩容。 ```c void vector_push_front(Vector* v, Element val) { if (!v || !val) return; resize(v); for (int i = v->size; i > 0; --i) { v->data[i] = v->data[i - 1]; // 移动元素 } v->data[0] = strdup(val); // 插入新元素 v->size++; } ``` ##### (5)**在任意位置插入元素** 允许用户指定索引位置插入新元素,同样涉及扩容和位移操作。 ```c void vector_insert(Vector* v, int idx, Element val) { if (!v || !val || idx < 0 || idx > v->size) return; resize(v); for (int i = v->size; i > idx; --i) { v->data[i] = v->data[i - 1]; // 移动元素 } v->data[idx] = strdup(val); // 插入新元素 v->size++; } ``` --- #### 3. **完整的示例程序** 以下是一个综合使用的例子,演示了如何创建、插入和销毁动态数组。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 上述定义省略... int main() { Vector* vec = vector_create(); if (!vec) { fprintf(stderr, "Failed to create vector.\n"); return -1; } // 添加多个元素 vector_push_back(vec, "Apple"); vector_push_back(vec, "Banana"); vector_push_front(vec, "Orange"); // 打印所有元素 printf("Elements in the vector:\n"); for (int i = 0; i < vec->size; ++i) { printf("[%d]: %s\n", i, vec->data[i]); } // 销毁动态数组 vector_destroy(vec); return 0; } ``` 运行结果: ``` Elements in the vector: [0]: Orange [1]: Apple [2]: Banana ``` --- #### 4. **注意事项** - **内存管理**:由于动态数组涉及到多次内存分配与释放,务必注意防止内存泄漏。 - **边界条件**:插入或删除时需验证索引合法性,避免越界访问引发错误。 - **性能优化**:适当调整扩容策略可减少不必要的内存浪费或频繁分配带来的开销[^3]。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值