C++的std::vector

32 篇文章 1 订阅

std::vector是C++标准库中的一个序列容器,它封装了动态大小数组的行为std::vector允许你在运行时动态地添加和删除元素,自动管理存储空间的分配和释放。由于其灵活性和易用性,std::vector在C++程序中被广泛使用,特别是在需要存储一系列元素时。

基本特性

  • 动态大小:std::vector的大小可以在运行时动态改变,不需要手动管理内存。
  • 连续存储:std::vector在内存中连续存储元素,这意味着你可以像使用数组一样使用指针或迭代器来遍历vector。
  • 随机访问:可以通过下标操作符[]直接访问std::vector中的任何元素,访问时间为常数时间复杂度(O(1))。

创建和初始化

#include <vector>

std::vector<int> vec; // 创建一个空的int型vector
std::vector<int> vec2(10, 0); // 创建一个包含10个int型元素的vector,每个元素初始化为0
std::vector<int> vec3 = {1, 2, 3, 4, 5}; // 使用初始化列表创建并初始化vector

添加和删除元素

vec.push_back(10); // 在vec的末尾添加一个元素10
vec.pop_back(); // 删除vec末尾的元素

访问元素

int firstElement = vec[0]; // 访问第一个元素
int lastElement = vec.back(); // 访问最后一个元素

迭代器

std::vector提供了迭代器来遍历容器中的元素。

for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";
}
// 使用C++11范围for循环更简洁
for(auto& element : vec) {
    std::cout << element << " ";
}

容量和大小

  • size():返回std::vector中元素的个数。
  • capacity():返回std::vector在不重新分配内存的情况下能容纳的最大元素数。
  • resize(n):调整vector的大小为n,如果n大于当前大小,则添加默认构造的元素。
  • reserve(n):请求改变vector的容量至少为n,这可以减少多次添加元素时的重新分配次数。

例子1

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec;
    vec.push_back(10); // 向vec添加一个元素10
    vec.push_back(20); // 再添加一个元素20

    // 打印vec的内容
    for(int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

例子2:与opencv一起用

在使用OpenCV处理图像时,push_back也可以用于cv::Mat对象,这在需要收集图像或图像特征数据时特别有用。

添加新行到cv::Mat

如果你有一个cv::Mat矩阵,想要在其末尾添加一行,可以使用push_back。这在从图像序列中构建数据集等场景中非常有用:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main() {
    // 创建一个空的Mat对象
    Mat mat;

    // 创建一个新的行向量
    Mat row = Mat::ones(1, 5, CV_32F); // 创建一个1x5的浮点型行向量,所有元素初始化为1

    // 将这行添加到mat中
    mat.push_back(row);

    // 再添加一个不同的行
    row = Mat::zeros(1, 5, CV_32F); // 创建一个1x5的浮点型行向量,所有元素初始化为0
    mat.push_back(row);

    std::cout << "mat = " << std::endl << mat << std::endl;

    return 0;
}

在这个例子中,mat最初是空的。我们首先添加了一个所有元素为1的行,然后添加了一个所有元素为0的行。最终,mat包含了两行。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王菜菜丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值