C++ vector容器函数使用范例

1. vector的概念及优势

在C++语言中,容器是一种数据结构,主要用于存储多个数据元素。而vector是C++ STL提供的容器之一,它能够方便的管理一个动态大小的数组。对于需要动态管理大小的数据集合,vector是一个非常有用的选择。

相比于静态数组,vector的优势在于:

动态分配内存,可以自动增加和缩小数组的大小

支持随机访问,像数组一样可以通过下标访问

支持高效的插入和删除操作,不会造成数据的大量移动

在内存的空间方面,vector是连续的存储空间,可以更好的利用CPU缓存,提高程序性能

2. vector的创建

创建一个vector最基本的方法,是通过声明一个vector对象。下面是创建一个空的vector对象:

#include <vector>

using namespace std;

vector<int> a; // 创建一个空的vector对象a

上述代码中,通过vector<int>定义了一个整型的vector。vector的类型可以是任何类型,包括C++内置的数据类型和用户自定义的类型。可以看到,vector的头文件是<vector>

2.1 通过初始化列表创建vector

vector可以通过初始化列表来创建。下面的代码展示了一个vector对象的总体结构和一个具有初始化数据的vector对象。

#include <vector>

using namespace std;

int main() {

vector<int> a = {1, 2, 3};

return 0;

}

在上述代码中,vector对象a被初始化为{1, 2, 3}。当初始化数据不止一个时,可以用逗号分隔。在初始化的时候,vector会根据初始化数据的大小调整动态数组的大小。

需要注意的是,如果初始化数据太多,初次分配比较大的内存,可能造成大量空间的浪费。此时,可以使用reserve()函数来控制vector的容量大小,如下所示:

vector<int> a;

a.reserve(10); // 控制vector的容量最小为10

2.2 通过迭代器创建vector

vector可以通过迭代器创建。迭代器是指向数组中单个元素的指针或引用。vector中的迭代器是一种随机访问迭代器,可以通过下标访问数组元素。下面的代码演示了如何通过迭代器创建一个vector:

#include <vector>

using namespace std;

int main() {

int a[] = {1, 2, 3};

vector<int> b(a, a + 3);

return 0;

}

上述代码中,使用了迭代器初始化vector,第一个参数是指向数组中第一个元素的迭代器即数组的首地址,第二个参数是指向最后一个元素下一个位置的迭代器,即数组末尾后面的位置。由此,可以构造一个[a,b)左闭右开区间来初始化vector。在上面的代码中,a是数组地址,a+3是a中第4个元素的地址。

3. vector的基本操作

3.1 vector的大小和容量

vector有两个重要的指标:大小和容量。vector大小是指容器中元素的数量,而容量(capacity)是指容器中可以存储的元素的数量。

对于一个vector,其实质容量(实际分配内存的大小)和当前容量(可用内存的大小)并不相同。当vector存储的元素个数达到了容量大小时,vector会重新分配内存并将元素复制到重新分配的内存中并构造新的元素。为了提高性能,vector往往超过当前大小分配一些额外的内存。

3.2 向vector中添加元素

vector提供了两个主要的添加元素的函数:push_back()和emplace_back()。下面我们来逐一介绍。

3.2.1 push_back()

push_back()是向vector中添加元素最常用的方法。它接受一个常量引用作为参数,将该值添加到vector的尾部。下面是一个例子。

vector<int> a;

a.push_back(1);

a.push_back(2);

a.push_back(3);

上述代码创建了一个空的vector对象a,并依次向其中添加了三个元素。

3.2.2 emplace_back()

emplace_back()是C++11添加的新函数,与push_back()相比,它有一些额外的优势。emplace_back()直接构造元素,而push_back()则是将构造函数的参数作为副本放入vector中。

因为这些附加开销,emplace_back()比push_back()稍微快一点,并且更加优化内存使用。下面是一个使用emplace_back()的示例:

struct Foo {

int x;

double y;

string z;

Foo(int x, double y, const string& z) : x(x), y(y), z(z) {}

};

vector<Foo> b;

b.emplace_back(1, 2.0, "Hello world!");

上述代码初始化了一个包含三个不同类型成员的结构体Foo,然后构造了一个vector b。使用emplace_back()函数将一个Foo对象添加到vector中。该函数以整数、双精度浮点数和字符串作为参数。

3.3 删除vector中的元素

vector同样也提供了两个主要的函数用于删除元素:pop_back()和erase()。下面我们逐一介绍。

3.3.1 pop_back()

pop_back()函数用于删除vector中的最后一个元素,也就是尾部的元素。下面是一个例子。

vector<int> a;

a.push_back(1);

a.push_back(2);

a.push_back(3);

a.pop_back(); // 删除最后一个元素

上述代码演示了如何使用pop_back()函数实现删除vector中的元素。

3.3.2 erase()

erase()函数用于删除vector中指定位置的元素。下面是一个例子。

vector<int> a;

a.push_back(1);

a.push_back(2);

a.push_back(3);

a.erase(a.begin() + 1); // 删除第二个元素

上述代码演示了如何使用erase()函数删除vector中的指定元素。在这个例子中,我们指定删除第二个元素。由于vector中的元素在内存中是连续存储的,所以vector可以非常高效地执行erase()操作。

3.4 vector的遍历

vector是顺序容器,它具有随机访问的能力,可以像数组一样通过下标访问元素。下面是一个vector的遍历示例:

vector<int> a;

a.push_back(1);

a.push_back(2);

a.push_back(3);

for (int i = 0; i < a.size(); ++i) {

cout << a[i] << endl;

}

遍历vector的起始位置是0,结束位置为a.size() - 1。这个遍历方式非常简单,但是需要遍历完整个vector,所以它的时间复杂度是O(n)。

4. 总结

本文介绍了如何使用C++ STL的vector容器。vector是一个非常有用的容器,可以动态管理数组的大小并支持高效的随机访问、插入和删除操作。本文详细介绍了vector的创建、添加元素、删除元素以及遍历vector等操作。通过这篇文章,相信读者已经对vector容器有一个比较完整的了解,可以快速在实际开发中使用vector。最后,需要注意的是,vector有固定的初始化方法和常用的操作函数,根据实际开发需要,选择适当的操作方式和函数使用。

后端开发标签