c++中vector的由来与用法

简介: c++中vector的由来与用法

引言:

最近做题的时候发现vector出现的挺多,课本上有讲过vector,但是为什么会有vector,它的优势又是什么,查阅资料后,写下此篇

很多人都知道vector是一个不用再初始化就必须制定大小的边长数组,但是为什么c++需要vector这样一个容器呢?


在了解vector之前,我们先来了解一下STL。

STL是什么

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。

STL 是 C++ 标准库的一部分,不用单独安装(可能这也是它能广泛流行的原因之一吧)。我们在写程序的时候,STL就是在我们引入的各个头文件中,以源码的形式存在。

从根本上说,STL 是一些容器、算法和其他一些组件的集合,所有容器算法都是总结了几十年来算法和数据结构的研究成果,汇集了许多计算机专家学者经验的基础上实现的,它借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。

这里提到的容器,本质上就是封装有数据结构的模板类。vector就是STL中的容器之一。

为什么会出现STL

人的天性本就是懒惰的,都想通过最小的努力获取最大的回报,而STL就是由于这种懒惰应运而生。

举个例子来说明一下:

问题:如果我们想创建一个数组,但又不确定它的长度,那么我们可以在堆中申请一个动态数组

int*a=new int[n];

这样的数组大小取决于变量n,但是如果出现空间不足的情况,我们需要扩大空间为m时,则需要这几步

int*b=new int[m];//搞一个更大的数组
memecpy(b, a, sizeof(int)*n);//把a的数据拷贝到b中
delete[]a;//释放a所指空间
a=b;//a也指向b了

而完成相同的操作,如果采用 STL 标准库中的vector,只用一行代码,且不会出现空间不够的情况

vector<int>a//数组a当前的长度为0,但它可以根据存储数据的数量自动变长,就像一个气球

由上述例子明显可以看出,使用STL中的部件可以明显简化代码的复杂程度。这其实是因为STL屏蔽了众多细节,使得我们可以集中精力去实现程序的功能,无需再纠结某些细节如何用代码实现。

因此,如果你是一个懒人,非常建议去多用STL中的零件


接下来来了解下vector

vector是什么

vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

vector在C++中的用法

头文件

#include<vector>

功能函数

vector<int>c

(1)c.assign(beg,end) c.assign(n,elem)

将(beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。

传回索引idx所指的数据,如果idx越界,抛出out_of_range

(2)c.back()

传回最后一个数据,不检查这个数据是否存在。

(3)c.begin()

传回迭代器中的第一个数据地址。

(4)c.capacity()

返回容器当前已分配的容量。

(5)c.clear()

移除容器中所有数据。

(6)c.empty()

判断容器是否为空。

c.end() //指向迭代器中末端元素的下一个,指向一个不存在元素。

c.erase(pos)// 删除pos位置的数据,传回下一个数据的位置。

c.erase(beg,end)

删除[beg,end)区间的数据,传回下一个数据的位置。

(7)c.front()

传回第一个数据。

(8)get_allocator

使用构造函数返回一个拷贝。

c.insert(c.begin()+pos,elem)//在pos位置插入一个elem拷贝,传回新数据位置

c.insert(c.begin()+pos,n,elem)//在pos位置插入n个elem数据,无返回值

c.insert(c.begin()+pos,beg,end)//在pos位置插入在[beg,end)区间的数据。无返回值

(9)c.max_size()

返回容器中最大数据的数量。

(10)c.pop_back()

删除最后一个数据。

c.push_back(elem)

在尾部加入一个数据。

(11)c.rbegin()

传回一个逆向队列的第一个数据。

(12)c.rend()

传回一个逆向队列的最后一个数据的下一个位置。

(13)c.resize(num)

重新指定队列的长度。

(14)c.reserve()

保留适当的容量。

(15)c.size()

返回容器中实际数据的个数。

函数众多,但如果自己不用永远也不会熟练,众多懒人同胞们,多试试吧!


目录
打赏
0
1
1
0
25
分享
相关文章
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
215 2
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
116 3
【C++】map、set基本用法
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
273 4
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
164 0
|
4月前
|
C++
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
121 0
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
127 0
|
6月前
|
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
65 1
|
6月前
|
C++之打造my vector篇(下)
C++之打造my vector篇(下)
57 0
|
6月前
|
C++之打造my vector篇(上)
C++之打造my vector篇(上)
65 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等