Vector[C++]

C++中的std::vector简介

std::vector是C++标准模板库(STL)中的一种动态数组。它提供了一种可以动态增长和缩减的序列容器。与普通数组相比,std::vector能够自动管理内存,并且可以高效地访问任何元素。

std::vector的特点

  • 头文件:要包含#include <vector>的头文件
  • 动态大小std::vector的大小是动态的,可以在运行时增长和缩减。
  • 随机访问:可以通过索引快速访问任何元素,时间复杂度为O(1)。
  • 自动内存管理:不需要手动分配和释放内存,std::vector会处理这些细节。

std::vector的重要接口用法介绍

1. 初始化

在这里插入图片描述

vector

  • (1)
    空容器构造函数(默认构造函数)构造一个没有元素的空容器
  • (2)
    构造一个包含n个元素的容器。所有元素被初始化为val
  • (3)
    构造一个包含与[first,last]范围相同数量元素的容器(迭代器访问),其中每个元素以相同的顺序从该范围中的对应元素构造
  • (4)
    允许你通过另一个 std::vector 对象来初始化一个新的 std::vector。当你使用这个构造函数时,新创建的 std::vector 将包含与参数 x 相同的元素,即它将是 x 的一个副本。
#include <vector>

std::vector<int> vec; // (1)默认初始化,空vector
std::vector<int> vec(5); // (2)初始化为包含5个元素的vector,每个元素初始化为0
std::vector<int> vec(5, 10); // (2)初始化为包含5个元素的vector,每个元素初始化为10

int arr[] = { 1, 2, 3, 4, 5 };// (3)假设我们有一个整数数组
std::vector<int> vec(arr, arr + sizeof(arr) / sizeof(arr[0]));// (3)使用模板构造函数从数组创建vector

std::vector<int> originalVector = {1, 2, 3, 4, 5}; // 创建一个 vector 并初始化一些元素
std::vector<int> copyVector(originalVector);    // (4)使用拷贝构造函数创建一个新的 vector

2. 添加元素

在这里插入图片描述

push_back

  • push_back
    没啥说的尾插一个数或数组
    在这里插入图片描述

emplace_back

  • emplace_back
    在vector的末尾插入一个新元素,就在vector当前的最后一个元素之后。这个新元素是使用args作为其构造函数的参数来就地构造的。

push_backemplace_back的区别:

  • push_back 是将已存在的元素添加到 vector 的末尾。
  • emplace_back 是在 vector 的末尾直接构造一个新元素,这样可以更高效,特别是对于复杂类型的对象。
    而构造一个新的元素可以减少拷贝或者移动提升效率
vec.push_back(1); // 在vector末尾添加元素1
vec.emplace_back(2); // 在vector末尾构造一个新元素

3. 访问元素

在这里插入图片描述

operator[]

  • operator[]
    返回对vector容器中位置n的元素的引用,和string类似说白了就是方括号下标的使用

在这里插入图片描述

back

  • back
    返回对vector中最后一个元素
int first = vec[0]; // 通过索引访问第一个元素
int last = vec.back(); // 返回最后一个元素

4. 修改元素

在这里插入图片描述

operator

  • operator[]
    返回对vector容器中位置n的元素的引用,和string类似说白了就是方括号下标的使用
vec[0] = 100; // 将第一个元素修改为100

5. 遍历

三种,下标,迭代器,范围for

std::vector<int> vec({ 1, 2, 3, 4, 5, 6, 7 });

for (int i = 0; i < vec.size(); ++i) 
{
    std::cout << vec[i] << std::endl;
}

auto it = vec.begin();
while (it!=vec.end())
{
	cout << *it << " ";
	it++;
}
cout << endl;

for (auto &element : vec) 
{
    std::cout << element << std::endl;
}

6. 容量和大小

在这里插入图片描述

size

  • szie
    返回vector中元素的个数

在这里插入图片描述

empty

  • empty
    返回vector是否为空(即其大小是否为0)
int size = vec.size(); // 返回vector中的元素数量
bool isEmpty = vec.empty(); // 如果vector为空,返回true

7. 清空和删除

clear

clear清空vector中的所有元素,没什么说的

在这里插入图片描述

erase

  • erase
    用于删除容器中的元素。它可以删除指定位置的元素,或者删除一个范围内的元素
vec.clear(); // 清空vector中的所有元素
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.erase(vec.begin() + 2); // 删除第三个元素(索引为2的元素,因为索引从0开始)
iterator erase(iterator first, iterator last);//用迭代器范围删除

8. 查找

find

std::vectorfind 函数有两种重载形式:

  1. 查找单个元素

    iterator find(const value_type& value);
    

    这个函数接受一个值作为参数,它会在 vector 中查找这个值,并返回一个指向该值的迭代器。

  2. 查找元素范围

    iterator find(const_iterator first, const_iterator last, const value_type& value);
    

    这个函数接受两个迭代器作为参数,表示搜索的范围,以及一个值作为参数,它会在指定范围内查找这个值,并返回一个指向该值的迭代器。

下面是一个使用 findstd::vector 中查找元素的例子:

#include <vector>
#include <iostream>

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

    // 查找元素4
    auto it = std::find(vec.begin(), vec.end(), 4);

    // 检查是否找到了元素
    if (it != vec.end()) {
        std::cout << "Element found: " << *it << std::endl;
    } else {
        std::cout << "Element not found." << std::endl;
    }

    return 0;
}

在这个例子中,我们使用 find 函数在 vec 中查找元素4。如果找到了,find 将返回一个指向元素4的迭代器;如果没有找到,它将返回一个指向 vec 末尾的迭代器。根据这个结果,我们打印出相应的消息。

相关推荐

  1. <span style='color:red;'>vector</span>

    vector

    2024-03-20 02:38:03      18 阅读
  2. C++ vector

    2024-03-20 02:38:03       15 阅读
  3. vector容器

    2024-03-20 02:38:03       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 02:38:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 02:38:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 02:38:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 02:38:03       18 阅读

热门阅读

  1. 抽象类abstract

    2024-03-20 02:38:03       19 阅读
  2. 安达发|APS高级计划与排产软件在家具业的新趋势

    2024-03-20 02:38:03       21 阅读
  3. 02 Statement和PreparedStatement

    2024-03-20 02:38:03       19 阅读
  4. SpringBoot项目串口通讯之jSerialComm

    2024-03-20 02:38:03       22 阅读
  5. 代码随想录算法训练营|一刷总结与反思

    2024-03-20 02:38:03       25 阅读
  6. 73_Pandas获取分位数/百分位数

    2024-03-20 02:38:03       19 阅读
  7. Flutter如何正确使用图片资源

    2024-03-20 02:38:03       18 阅读
  8. UDP协议

    UDP协议

    2024-03-20 02:38:03      20 阅读