STL --- 二、容器 (1)Vector

目录

1、std::vector 的特点包括:

2、std::vector 常用的 API:

3、std::vector 使用的例子:

4、std::vector 的一些坑

5、std::vector 动态扩容机制


vector 是 C++ 标准库中的容器之一,它是一个动态数组,可以自动扩展大小。vector 中的元素是连续存储的,可以通过下标或迭代器访问。

1、std::vector 的特点包括:

(1)自动扩展大小:当 vector 中的元素数量达到容量时,vector 会自动分配更大的内存空间,并将旧元素拷贝到新的内存空间中。

(2)支持随机访问:可以通过下标或迭代器访问 vector 中的元素,时间复杂度为 O(1)。

(3)插入和删除元素效率较低:当在 vector 中间插入或删除元素时,需要移动后面的元素,时间复杂度为 O(n)。

(4)内存管理:vector 会自动管理内存,但在需要频繁插入或删除元素时,可能会造成内存的浪费。

注意:使用 vector 时需要包含头文件 <vector>,常用的操作包括 push_back、pop_back、insert、erase、size、empty、clear 等。

2、std::vector 常用的 API:

1. push_back():在 vector 的末尾添加一个元素。
2. pop_back():删除 vector 的末尾元素。
3. size():返回 vector 中元素的数量。
4. empty():判断 vector 是否为空。
5. clear():清空 vector 中的所有元素。
6. resize():改变 vector 的大小。
7. reserve():预留 vector 的容量。
8. front():返回 vector 中的第一个元素。
9. back():返回 vector 中的最后一个元素。
10. data():返回指向 vector 内部数组的指针。
11. insert():在 vector 中插入一个或多个元素。
12. erase():从 vector 中删除一个或多个元素。
13. emplace():在 vector 中构造一个新元素。
14. emplace_back():在 vector 的末尾构造一个新元素。
15. swap():交换两个 vector 的内容。
16. operator[]:通过下标访问 vector 中的元素。

这些 API 可以帮助我们方便地操作 std::vector 容器,实现动态数组的功能。

3、std::vector 使用的例子:

主要是初始化,以及迭代器遍历的

#include <vector>

int main() {
	// 初始化一个空的vector
	std::vector<int> v1;

	// 初始化一个有5个元素的vector,每个元素都是0
	std::vector<int> v2(5);

	// 初始化一个有5个元素的vector,每个元素都是1
	std::vector<int> v3(5, 1);

	// 初始化一个有3个元素的vector,每个元素的值分别为1、2、3
	std::vector<int> v4{ 1, 2, 3 };

	// 初始化一个vector,其元素与另一个vector相同
	std::vector<int> v5(v4);

    // 输出vector的元素
    std::cout << "v1: ";
    for (auto i : v1) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 使用auto关键字定义迭代器
    for (auto it = v.begin(); it != v.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用const关键字定义只读迭代器
    for (std::vector<int>::const_iterator cit = v.cbegin(); cit != v.cend(); ++cit) {
        std::cout << *cit << " ";
    }
    std::cout << std::endl;

    // 要修改vector中的元素,需要使用非const迭代器
    std::vector<int> v = {1, 2, 3, 4, 5};
    for (auto it = v.begin(); it != v.end(); ++it) {
        *it *= 2;  // 修改vector中的元素
    }

	return 0;
}

4、std::vector 的一些坑

(1) 内存分配问题:std::vector 在动态分配内存时可能会出现内存分配失败的情况,导致程序崩溃。此外,频繁的内存分配和释放也会导致性能问题。

(2)迭代器失效问题:当向 std::vector 中添加或删除元素时,迭代器可能会失效,导致程序出错。为了避免这种情况,需要使用正确的迭代器类型,并且在添加或删除元素时更新迭代器。

(3)拷贝和移动语义问题:std::vector 中的元素类型必须具有拷贝和移动语义,否则会导致编译错误或运行时错误。

(4)多线程问题:std::vector 不是线程安全的,如果在多个线程中同时访问同一个 std::vector 对象,可能会导致竞争条件和数据不一致的问题。

(5)容量问题:std::vector 在添加元素时可能会自动扩容,但是如果容量不够用,就会导致频繁的内存分配和释放,影响程序性能。为了避免这种情况,可以在添加元素前先预留足够的空间。可以使用reserve函数。

5、std::vector 动态扩容机制

std::vector 动态扩容机制:是在当前容量不足以容纳新元素时,重新分配一块更大的内存空间,并将原来的元素复制到新的内存空间中,把需要插入的元素放到最后,最后释放原有的空间。

也就是经典的三步操作:申请-搬移-释放,那么以前的内存指针自然就不可用了。

具体步骤如下:

(1)当插入元素时,如果当前容量不足以容纳新元素,就需要进行扩容操作。

(2)计算新的容量大小,一般是原来容量的两倍。

(3)申请新的内存空间,一般使用 operator new 或 malloc 函数。

(4)将原来的元素复制到新的内存空间中,可以使用 memcpy 函数。

(5)释放原来的内存空间,一般使用 operator delete 或 free 函数。

(6)更新 vector 的容量和指向内存空间的指针。

(7)插入新元素到 vector 中。

需要注意的是,扩容操作可能会导致迭代器失效,因为扩容后指向原来内存空间的迭代器指针已经无效了。因此,在进行扩容操作时,需要谨慎处理迭代器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值