c++ vector数组详细介绍(一)

简介: c++ vector数组详细介绍(一)

1. 基础概念

1.1 vector是什么,它与数组的区别

vector 是 C++ 标准模板库(STL)中的一种序列容器,它可以被看作是一个动态大小的数组。下面是对 vector 和传统数组的基本介绍,以及它们之间的主要区别:


Vector

类型安全:

vector 是泛型的,可以存储任意类型的元素,例如 vector, vector 等。

内存管理:

vector 在内部自动处理内存分配和释放,使得使用更加方便。


附加功能:

提供了丰富的成员函数,如 push_back(), pop_back(), insert(), erase() 等,方便操作元素。

迭代器支持:

支持迭代器,可以与 STL 算法一起使用。


数组

固定大小:

数组的大小在声明时确定,之后不能改变。


类型特定:

数组只能存储声明时指定的类型。


内存管理:

数组不会自动处理内存分配和释放,需要程序员手动处理动态分配的数组(如使用 new 和 delete)。

直接访问:

提供了直接通过索引访问元素的简单方式。


效率:

在某些情况下,由于没有动态大小的开销,数组可能比 vector 更高效。

主要区别


大小灵活性:

vector 可以在运行时改变大小,而数组的大小在编译时固定。

易用性:

vector 提供了更多的辅助函数和自动的内存管理,使得它在使用上更为方便。


性能:

对于固定大小的数据集,数组可能更有效率;但当需要动态大小时,vector 的优势更明显。

安全性:

vector 的成员函数如 at() 提供边界检查,而数组则没有这样的安全性保障。

1.2 总结

总的来说,vector 提供了更多的灵活性和安全性,尤其是在处理大小可变的数据集时。而数组在处理固定大小和类型的数据时可能更为高效。


2. Vector基本操作

2.1 包含头文件


要在 C++ 程序中使用 vector,需要包含 C++ 标准模板库中的 头文件。这样做可以访问 std::vector 类。

在 C++ 源文件的开始部分,添加以下预处理器指令:

#include <vector>


一旦包含了 头文件,就可以在程序中声明和使用 vector 类型了。这里是一个基本的使用示例:

#include <iostream>
#include <vector>

int main() {
    // 创建一个 int 类型的 vector
    std::vector<int> myVector;

    // 向 vector 添加元素
    myVector.push_back(10);
    myVector.push_back(20);

    // 遍历 vector 并打印元素
    for (int elem : myVector) {
        std::cout << elem << std::endl;
    }

    return 0;
}

在这个示例中,首先包含了  和  头文件,然后在 main 函数中创建了一个类型为 int 的 vector。我们向这个 vector 中添加了一些元素,并使用范围基 for 循环遍历并打印这些元素。


记住,vector 是在 std 命名空间中定义的,所以需要使用 std::vector 来引用它,除非使用了 using namespace std; 语句。不过,出于代码清晰性和避免命名冲突的考虑,建议直接使用 std:: 前缀。

2.2 声明和初始化

在 C++ 中,声明一个 vector 需要指定其存储元素的类型。vector 是模板类,因此可以声明任何类型的 vector。以下是 vector 声明的基本语法及一些常见示例。

声明

std::vector<ElementType> vectorName;

ElementType 是你打算在 vector 中存储的数据类型。

vectorName 是你给 vector 命名的名称。

示例:


声明一个整数类型的 vector:

std::vector<int> myIntVector;


声明一个双精度浮点数类型的 vector:

std::vector<double> myDoubleVector;


声明一个字符串类型的 vector:

std::vector<std::string> myStringVector;


声明一个自定义类型的 vector (例如,假设有一个 Employee 类):

std::vector<Employee> myEmployeeVector;

初始化

除了基本的声明之外,vector 也可以在声明时进行初始化。

默认初始化 (创建一个空的 vector):
std::vector<int> myVector;


初始化为特定大小 (例如,大小为 10):
std::vector<int> myVector(10);


初始化为特定大小并赋予初始值 (例如,10 个元素,每个元素的值为 0):
std::vector<int> myVector(10, 0);
使用初始化列表:
std::vector<int> myVector = {1, 2, 3, 4, 5};

2.3 访问元素

在 C++ 中,vector 提供了多种方法来访问其元素。最常用的方法包括使用下标运算符 [] 和成员函数 at(),以及通过迭代器。下面是每种方法的详细介绍:

使用下标运算符 []


这是访问 vector 元素最直接的方法。语法类似于数组,使用索引来访问元素。下标从 0 开始,最大为 vector 的大小减一。使用下标运算符时,不会进行边界检查,因此超出范围的访问可能导致未定义行为。

std::vector<int> v = {10, 20, 30, 40};
std::cout << v[2];  // 输出第三个元素,结果为 30


使用成员函数 at()

at() 方法提供了边界检查。如果索引超出范围,它会抛出一个 std::out_of_range 异常。这种方法比 [] 运算符更安全,特别是在调试阶段。

std::vector<int> v = {10, 20, 30, 40};
std::cout << v.at(2);  // 输出第三个元素,结果为 30
try {
    std::cout << v.at(4);  // 超出范围,将抛出异常
} catch (const std::out_of_range& e) {
    std::cerr << "Error: " << e.what() << std::endl;
}

使用迭代器

vector 支持迭代器,这是一种更通用和灵活的访问方式。迭代器可以用来遍历 vector 的所有元素。

std::vector<int> v = {10, 20, 30, 40};
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << std::endl;  // 输出当前元素
}

使用范围基 for 循环(C++11 及以后版本)

这是一种简洁的遍历 vector 的方法。自动处理迭代和访问。

std::vector<int> v = {10, 20, 30, 40};
for (int num : v) {
    std::cout << num << std::endl;  // 输出当前元素
}

注意事项


在使用下标运算符 [] 时,要确保不会访问超出 vector 范围的元素。

如果程序的健壮性是首要考虑,使用 at() 方法更为安全,因为它会进行边界检查。

使用迭代器或范围基 for 循环可以更加优雅地遍历 vector。

2.4 修改元素

在 C++ 中,vector 提供了多种方式来修改其元素。这些方法包括直接访问和修改特定元素、添加新元素、删除现有元素,以及其他更复杂的操作。以下是这些方法的详细介绍:


c++ vector数组详细介绍(二)https://developer.aliyun.com/article/1437017?spm=a2c6h.13262185.profile.52.5bba685cuSQkDD

c++ vector数组详细介绍(三)https://developer.aliyun.com/article/1437019?spm=a2c6h.13262185.profile.51.5bba685cuSQkDD

目录
相关文章
|
15天前
|
C++
c++的学习之路:13、vector(2)
c++的学习之路:13、vector(2)
21 0
|
1天前
|
算法 C++ 容器
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
4 0
|
9天前
|
存储 C++
【C++模板】模板实现通用的数组
【C++模板】模板实现通用的数组
|
14天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
33 1
|
14天前
|
存储 缓存 编译器
【C++进阶(五)】STL大法--list模拟实现以及list和vector的对比
【C++进阶(五)】STL大法--list模拟实现以及list和vector的对比
|
14天前
|
编译器 C++
【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
|
14天前
|
存储 C语言 C++
【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现
【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现
|
15天前
|
存储 C++ 容器
c++的学习之路:12、vector(1)
c++的学习之路:12、vector(1)
14 0
|
25天前
|
存储 算法 编译器
【C++初阶】STL详解(三)vector的介绍与使用
【C++初阶】STL详解(三)vector的介绍与使用
36 0
|
25天前
|
存储 编译器 C++
【C++初阶】STL详解(四)vector的模拟实现
【C++初阶】STL详解(四)vector的模拟实现
46 1