【C++】vector常见的使用方式

news/2024/7/7 21:36:18

前言:在上一篇中我们讲到了string类的模拟实现,今天我们将进一步的去学习vector的一些常用的使用方法。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录标题

  • 什么是vector
  • vector的使用
    • vector构造函数的使用
    • vector常见函数的使用
      • 迭代器的使用
      • rebegin()和rend()函数
      • push_back():在向量的末尾添加一个元素
      • pop_back():删除向量的最后一个元素
      • size():返回向量中元素的个数
      • empty():检查向量是否为空,如果为空则返回 true,否则返回 false
      • capacity()
      • clear():清空向量中的所有元素
      • front():返回向量的第一个元素
      • back():返回向量的最后一个元素
      • insert():在指定位置插入一个或多个元素
      • erase():删除指定位置或指定范围的元素
      • resize():调整向量的大小
      • swap():交换两个向量的内容
      • vector中operator[]
    • vector中嵌套vector的二维矩阵或多维数组

什么是vector

在C++中,vector是一种动态数组容器,可以存储一系列具有相同数据类型的元素。它提供了一些操作函数,如插入、删除、访问等,使得对数组进行操作更加方便和灵活。

与普通的数组相比,vector具有以下优点:

  1. 可以在运行时动态调整大小,不需要事先指定大小;
  2. 可以自动处理内存分配和释放,减少手动管理内存的工作量;
  3. 提供了更多的操作函数,如插入、删除、查找等;
  4. 可以通过下标访问元素。

vector的使用

vector构造函数的使用

  1. 默认构造函数
vector<int> vec; // 创建一个空的整数向量
  1. 带有初始值的构造函数:
int main()
{
	//vector<int> vec; // 创建一个空的整数向量
	int n = 0,value = 0;
	cout << "输入元素个数" << endl;
	cin >> n;
	vector<int> vec(n); // 创建一个包含 n 个默认初始化的整数元素的向量
	for (auto e : vec)//遍历容器中的值
	{
		cout << e << " ";
	}
	cout << endl;

	cout << "输入元素的值" << endl;
	cin >> value;
	vector<int> vec1(n, value); // 创建一个包含 n 个值为 value 的整数元素的向量
	for (auto e : vec1)//遍历容器中的值
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

  1. 复制构造函数
int main()
{
	vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量
	vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2
	for (auto s : vec2)
	{
		cout << s << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
4. 列表初始化 (C++11 及以上版本)

int main()
{
	vector<int> vec4{ 1, 2, 3, 4, 5 }; // 使用列表初始化创建向量 vec4
	for (auto s : vec4)
	{
		cout << s << " ";
	}
	return 0;
}

在这里插入图片描述

  1. 区间构造函数
int main()
{
	vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量
	vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2
	for (auto s : vec2)
	{
		cout << s << " ";
	}
	cout << endl;
	vector<int> vec3(vec1.begin(), vec1.end()); // 使用迭代器指定区间来创建向量 vec3
	for (auto s : vec3)
	{
		cout << s << " ";
	}
	return 0;
}

在这里插入图片描述


vector常见函数的使用

迭代器的使用

在C++中,vector类提供了**begin()end()**成员函数来获取指向容器中第一个元素和最后一个元素之后位置的迭代器。

调用begin()函数会返回一个指向容器中第一个元素的迭代器。调用end()函数会返回一个指向容器中最后一个元素之后位置的迭代器。

int main() 
{
    std::vector<int> vec = { 1, 2, 3, 4, 5 };
    // 使用begin()函数获取指向第一个元素的迭代器
    std::vector<int>::iterator it_begin = vec.begin();

    // 使用end()函数获取指向最后一个元素之后位置的迭代器
    std::vector<int>::iterator it_end = vec.end();

    // 使用迭代器遍历vector并输出所有元素
    for (std::vector<int>::iterator it = it_begin; it != it_end; ++it) 
    {
        std::cout << *it << " ";
    }
    return 0;
}

在这里插入图片描述


rebegin()和rend()函数

在使用vector中的rbegin()rend()函数时,请按照以下步骤进行操作:

  1. 在代码中包含<vector>头文件。
  2. 创建一个vector对象并向其中添加元素。
  3. 使用rbegin()函数获取指向向量最后一个元素的迭代器。
  4. 使用rend()函数获取指向向量中第一个元素之前位置的迭代器。
  5. 使用循环以逆序的方式遍历向量,从rbegin()函数返回的迭代器开始,到rend()函数返回的迭代器结束。

下面是一个示例来说明用法:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec = {1, 2, 3, 4, 5};

    // 以逆序的方式遍历向量
    for (auto it = myVec.rbegin(); it != myVec.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出结果:

5 4 3 2 1

在这个例子中,我们创建了一个名为myVecvector对象,并用一些整数值进行了初始化。然后,我们使用for循环和一个逆序迭代器(rbegin()函数)和一个普通迭代器(rend()函数)来以逆序的方式打印向量的元素。

push_back():在向量的末尾添加一个元素

int main()
{
	vector<int> vec;
	vec.push_back(10); // 向 vec 中添加元素 10
	vec.push_back(20); // 向 vec 中添加元素 20
	vec.push_back(20); // 向 vec 中添加元素 20
	vec.push_back(0); // 向 vec 中添加元素 20
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述


pop_back():删除向量的最后一个元素

int main()
{
	vector<int> vec = { 10, 20, 30,40,50 };
	cout << "删除前" << endl;
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	cout << "删除后" << endl;
	vec.pop_back(); // 删除 vec 的最后一个元素
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述


size():返回向量中元素的个数

int main()
{
	vector<int> vec = { 10, 20, 30 };
	cout <<"该容器的元素个数是: " << vec.size() << endl;
	return 0;
}

在这里插入图片描述


empty():检查向量是否为空,如果为空则返回 true,否则返回 false

int main()
{
	vector<int> vec = { 1,2 };
	bool isEmpty = vec.empty(); // 返回 true,因为 vec 是空的
	if (isEmpty)
	{
		cout << "该容器是空的" << endl;
	}
	else
	{
		cout << "该容器不是空的" << endl;

	}
	return 0;
}

在这里插入图片描述


capacity()

在使用vectorcapacity()函数时,它返回的是vector当前分配的内存容量大小,即可以容纳的元素数量。以下是使用capacity()函数的几个常见情况:

  1. 获取vector的容量:使用capacity()函数可以获取当前vector的容量。
#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec;

    std::cout << "Vector capacity: " << myVec.capacity() << std::endl;

    return 0;
}

输出结果:

Vector capacity: 0

在这个例子中,我们创建了一个名为myVec的空vector对象,并使用capacity()函数获取其容量。由于vector是空的,所以容量为0。

  1. 预分配容量:有时候可以使用reserve()函数来预分配vector的容量,以减少不必要的重新分配的次数。
#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec;

    myVec.reserve(10);  // 预分配10个元素的容量

    std::cout << "Vector capacity: " << myVec.capacity() << std::endl;

    return 0;
}

输出结果:

Vector capacity: 10

在这个例子中,我们使用reserve()函数预分配了10个元素的容量,然后使用capacity()函数获取当前容量。

  1. 动态调整容量:vector会根据需要自动调整容量,以适应元素的添加和删除。当vector的元素数量超过当前容量时,会自动增加容量以容纳更多元素。
#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec;

    std::cout << "Initial capacity: " << myVec.capacity() << std::endl;

    for (int i = 0; i < 10; ++i) {
        myVec.push_back(i);
        std::cout << "Vector capacity after adding " << i << ": " << myVec.capacity() << std::endl;
    }

    return 0;
}

输出结果:

Initial capacity: 0
Vector capacity after adding 0: 1
Vector capacity after adding 1: 2
Vector capacity after adding 2: 4
Vector capacity after adding 3: 4
Vector capacity after adding 4: 8
Vector capacity after adding 5: 8
Vector capacity after adding 6: 8
Vector capacity after adding 7: 8
Vector capacity after adding 8: 16
Vector capacity after adding 9: 16

在这个例子中,我们创建了一个名为myVec的空vector对象,并使用capacity()函数获取初始容量。然后,我们使用push_back()函数向vector添加元素,并使用capacity()函数获取每次添加元素后的容量。可以看到,当元素数量超过当前容量时,vector会动态调整容量以容纳更多元素,容量的增长规律可能是指数级的(取决于编译器)。


clear():清空向量中的所有元素

int main()
{
	vector<int> vec = { 10, 20, 30 };
	cout << "清空前" << endl;
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	cout <<"该容器的元素个数是:" << vec.size() << endl;//查看容器中元素个数
	vec.clear(); // 清空 vec 中的所有元素
	cout << "清空后" << endl;
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	cout << "该容器的元素个数是:" << vec.size() << endl;//查看容器中元素个数
	return 0;
}

在这里插入图片描述


front():返回向量的第一个元素

int main()
{
	vector<int> vec = { 10, 20, 30 };
	int firstElement = vec.front(); // 返回 10
	cout << firstElement << endl;
	return 0;
}

在这里插入图片描述


back():返回向量的最后一个元素

int main()
{
	vector<int> vec = { 10, 20, 30 };
	int lastElement = vec.back(); // 返回 30
	cout << lastElement << endl;
	return 0;
}

在这里插入图片描述


insert():在指定位置插入一个或多个元素

int main()
{
	vector<int> vec = { 10, 20, 30 };
	vec.insert(vec.begin() + 1, 15); // 在索引为 1 的位置插入元素 15,vec 变为 {10, 15, 20, 30}
	for (auto e: vec)
	{
		cout << e << " ";
	}
	return 0;
}

在这里插入图片描述


erase():删除指定位置或指定范围的元素

int main()
{
	vector<int> vec = { 10, 20, 30 ,40, 50};
	vec.erase(vec.begin() + 1);
	vec.erase(vec.begin(), vec.begin() + 2); 
	for (auto e: vec)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述


resize():调整向量的大小

int main()
{

	vector<int> vec = { 10, 20, 30 };
	vec.resize(5); // 将 vec 调整为包含 5 个元素,未指定的元素将被默认初始化
	for (auto e: vec)
	{
		cout << e << " ";
	}
	cout << endl;
	vector<int> vec1 = { 10, 20, 30 };
	vec1.resize(10, 9);//将vec1调整成10个元素,未被指定的元素 初始化成9
	for (auto e : vec1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述


swap():交换两个向量的内容

int main()
{
	vector<int> vec1 = { 10, 20 };
	vector<int> vec2 = { 30, 40 };
	cout << "交换前" << endl;
	for (auto e : vec1)
	{
		cout << e << " ";
	}
	vec1.swap(vec2); // 交换 vec1 和 vec2 的元素,vec1 变为 {30, 40},vec2 变为 {10, 20}
	cout << endl;
	cout << "交换后" << endl;
	for (auto e : vec1)
	{
		cout << e << " ";
	}
}

在这里插入图片描述


vector中operator[]

在C++的vector中,operator[]是用于访问并操作vector中的元素的重载运算符。它允许您使用索引来访问和修改vector中的特定元素。以下是对operator[]的使用示例:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec = {1, 2, 3, 4, 5};

    // 通过使用索引来访问和修改元素
    std::cout << "Element at index 2: " << myVec[2] << std::endl;
    myVec[3] = 10;
    std::cout << "Modified element at index 3: " << myVec[3] << std::endl;

    return 0;
}

输出结果:

Element at index 2: 3
Modified element at index 3: 10

在这个例子中,我们创建了一个名为myVecvector对象,并使用初始化列表初始化其元素。然后,我们使用operator[]来访问索引为2和3的元素,并分别输出它们的值。接下来,我们将索引为3的元素修改为10,并再次使用operator[]访问并输出修改后的值。

需要注意的是,operator[]没有边界检查,如果使用超出vector有效索引范围的索引进行访问,会导致未定义的行为。因此,在使用operator[]时,务必确保所使用的索引在vector的有效范围内。

此外,还可以将operator[]用于循环遍历vector中的元素:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec = {1, 2, 3, 4, 5};

    // 使用operator[]遍历vector中的元素
    for (size_t i = 0; i < myVec.size(); ++i) {
        std::cout << "Element at index " << i << ": " << myVec[i] << std::endl;
    }

    return 0;
}

输出结果:

Element at index 0: 1
Element at index 1: 2
Element at index 2: 3
Element at index 3: 4
Element at index 4: 5

在这个例子中,我们使用operator[]在循环中遍历vector中的元素。通过递增索引变量i,我们可以依次访问vector中的元素,并输出它们的索引和值。


vector中嵌套vector的二维矩阵或多维数组

在C++中,可以使用vector嵌套vector来创建二维矩阵或多维数组。这种嵌套的vector可以用于存储和访问多个行和列的数据。

int main() {
    // 定义数组的大小
    int rows = 3;
    int cols = 4;

    // 创建一个二维vector
    std::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));

    // 对二维vector进行赋值
    int count = 1;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = count++;
        }
    }

    // 打印二维vector的内容
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}

在这里插入图片描述


好啦,今天的内容就到这里啦,下期内容预告vector的常见函数模拟实现,博主前段时间有点事情,后面这段时间会加班加点的更新!


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位接下来的每一天好运连连 💞💞

http://lihuaxi.xjx100.cn/news/2173540.html

相关文章

新加坡大带宽服务器的流量升级服务是如何实现的?

流量升级服务通常是通过增加服务器的网络带宽来实现的&#xff0c;新加坡大带宽服务器的流量升级服务是如何实现的?rak部落为您整理发布新加坡大带宽服务器的流量升级服务可能包括以下几个方面。 1. **硬件升级**&#xff1a;服务器可能需要更高性能的处理器、更大的内存容量和…

第三方软件检测机构要具备哪些资质要求?专业测试报告如何申请?

第三方软件检测机构是独立于软件开发商和用户之外的公正机构&#xff0c;负责对软件进行全面的检测和评估。其独立性保证了评测结果的客观性和公正性&#xff0c;有效避免了软件开发商对自身产品的主观偏见和误导。 要成为一家合格的第三方软件检测机构&#xff0c;需要具备一…

【C++】构造函数、析构函数、拷贝构造与运算符重载

文章目录 1.类的六个默认构造函数2.构造函数2.1特性2.1.1 函数名与类名相同2.1.2. 无返回值&#xff08;不能写void&#xff09;2.1.3. 对象实例化时编译器自动调用对应的构造函数2.1.4 构造函数可以重载2.1.5编译器生成默认的构造函数2.1.6编译器生成的默认构造有何用&#xf…

【量算分析工具-贴地面积】GeoServer改造Springboot番外系列十

【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客 【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客 【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客 【量算分析工具-方位角】GeoServer改造Springboot番外系列…

代码随想录算法训练营Day1|704.二分查找、27. 移除元素

704.二分查找 法一&#xff1a;左闭右闭 注意每次当target在nums[mid]左边时&#xff0c;right更新为mid-1&#xff1b;当target在nums[mid]右边时&#xff0c;left更新为mid1。 另外&#xff0c;不要忘记更新mid。 class Solution {public int search(int[] nums, int targe…

Spring Cloud Alibaba 架构-Sentinel熔断降级

Sentinel主要功能 Sentinel 是阿里巴巴开源的一款流量控制、熔断降级组件&#xff0c;它主要用于保护微服务系统。Sentinel 的主要功能包括以下几个方面&#xff1a; 1. 流量控制&#xff08;Flow Control&#xff09;&#xff1a; Sentinel 通过控制并发请求的数量或速率&am…

学习双向链表带哨兵demo

定义 在计算机科学中&#xff0c;链表是数据元素的线性集合&#xff0c;其每个元素都指向下一个元素&#xff0c;元素存储上并不连续。 双向链表&#xff0c;每个元素知道其上一个元素和下一个元素。 以下为示例代码&#xff1a; package com.tfq.arithmetic.linkedlist;imp…

力扣HOT100 - 169. 多数元素

解题思路&#xff1a; 有点类似于Boyer-Moore 投票算法&#xff0c;但更加形象。 class Solution {public int majorityElement(int[] nums) {int winner nums[0];int cnt 1;for (int i 1; i < nums.length; i) {if (winner nums[i]){cnt;} else if (cn…