c++——vector容器详解

vector概述

C++ 中的 std::vector 是一个动态数组,是标准模板库(STL)中的一个重要容器。它提供了动态大小、快速随机访问和插入/删除操作的能力,使其成为处理动态数据集合的常用选择。

vector——向量

向量是表示大小可以变化的数组的序列容器。

就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的规则指针上的偏移量来访问其元素,并且与在数组中一样有效。但与数组不同的是,它们的大小可以动态变化,容器会自动处理它们的存储。

在内部,向量使用动态分配的数组来存储其元素。当插入新元素时,可能需要重新分配此数组才能增大大小,这意味着分配一个新数组并将所有元素移动到其中。就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器中时,向量都不会重新分配。

取而代之的是,矢量容器可能会分配一些额外的存储空间来适应可能的增长,因此容器的实际容量可能大于严格需要的存储空间来容纳其元素(即其大小)。库可以实施不同的增长策略,以在内存使用和重新分配之间取得平衡,但在任何情况下,重新分配都应该只在对数增长的大小间隔内发生,以便可以在向量末尾插入单个元素时提供摊销的常数时间复杂度(参见 push_back)。

因此,与数组相比,向量消耗更多的内存,以换取管理存储和以有效方式动态增长的能力。

与其他动态序列容器(deques、lists 和 forward_lists)相比,向量非常有效地访问其元素(就像数组一样),并且相对有效地从其末端添加或删除元素。对于涉及在末端以外的位置插入或删除元素的操作,它们的性能比其他操作差,并且迭代器和引用的一致性不如列表和forward_lists。<官网翻译来>

主要特点和优势:

动态大小: std::vector 可以根据需要动态增长或缩小其大小,这意味着可以在运行时动态地分配内存来存储其元素。

随机访问: 支持使用索引(类似数组下标)进行快速随机访问。这是通过指针算术来实现的,因此访问元素的时间复杂度为 O(1)。

尾部插入/删除: 在尾部进行元素的插入和删除操作非常高效,时间复杂度为平均 O(1)。

内存管理: std::vector 负责管理其内部存储空间的分配和释放,这使得使用起来更为方便,不需要手动管理内存。

连续存储: std::vector 的元素在内存中是连续存储的,这有助于提高缓存命中率,从而提升访问效率。

迭代器支持: 提供了迭代器(iterator)接口,可以用于遍历容器中的元素。

标准库支持: 是 C++ 标准库提供的一部分,因此具有广泛的兼容性和可移植性。

使用示例:

#include <vector>
#include <iostream>

int main() {
   
   
    // 创建一个空的vector
    std::vector<int> vec;

    // 向vector中添加元素
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    // 访问vector中的元素
    std::cout << "Elements in vector:";
    for (size_t i = 0; i < vec.size(); ++i) {
   
   
        std::cout << " " << vec[i];
    }
    std::cout << std::endl;

    // 使用迭代器进行遍历
    std::cout << "Elements in vector (using iterator):";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
   
   
        std::cout << " " << *it;
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,std::vector 被用来存储整数,并展示了如何向其中添加元素、通过索引访问元素以及使用迭代器遍历元素。

成员类型

1,value_type:

  • std::vector::value_type 表示存储在 vector 中的元素的类型。
  • 例如,如果 std::vector 则 value_type 就是 int。
  • 这个类型通常是通过模板参数 T 来确定的。

2,reference:

  • std::vector::reference 表示对 vector 中元素的引用类型。
  • 例如,如果 std::vector 则 reference 就是 int&。
  • 通过这种引用类型,可以直接修改 vector 中的元素。

3,const_reference:

  • std::vector::const_reference 表示对 vector 中元素的常量引用类型。
  • 例如,如果 std::vector 则 const_reference 就是 const int&。
  • 这种类型允许读取但不允许修改 vector 中的元素。

4,iterator 和 const_iterator:

  • std::vector::iterator 表示 vector 中元素的迭代器类型,可以用来遍历和修改 vector 中的元素。
  • std::vector::const_iterator 则是对应的常量迭代器类型,只能用于读取元素,不能修改。
  • 例如,std::vector::iterator 和 std::vector::const_iterator 分别用于 std::vector 的可变和不可变遍历。

5,difference_type:

  • std::vector::difference_type 表示两个迭代器之间的距离类型。
  • 这个类型通常是 std::ptrdiff_t,用于计算迭代器之间的距离。

6,size_type:

  • std::vector::size_type 表示 vector 中元素数量的无符号整数类型。
  • 这个类型通常是 std::size_t,用于表示 vector 中元素的数量。

vector函数

构造函数

1,默认构造函数:

std::vector<int> vec; // 创建一个空的 int 类型的 vector
//构造一个空的 vector,不包含任何元素。

2,指定大小和初值构造函数:

std::vector<int> vec(5, 10); 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值