C++的std::vector

这篇具有很好参考价值的文章主要介绍了C++的std::vector。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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包含了两行。文章来源地址https://www.toymoban.com/news/detail-831584.html

到了这里,关于C++的std::vector的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [开发语言][c++]:左值、右值、左值引用、右值引用和std::move()

    写在前面: 如果你也被 左值、右值、左值引用、右值引用和std::move 搞得焦头烂额,相关概念和理解不够深入,或者认识模棱两可,那么这篇文章将非常的适合你,耐心阅读,相信一定会有所收获~~ 左值: 可以取地址、位于等号左边 – 表达式结束后依然存在的持久对象

    2024年02月02日
    浏览(61)
  • OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换

    通常情况下,在同一个opencv项目传递cv::Mat可直接通过const cv::Mat img这种方式传递,但是如果需要进行跨语言传递,比如C++传递到C#或者C#传递到C++,那么通常这种情况下需要将cv::Mat转换为内存指针比如unsigned char指针或者float指针进行传递。 1.1 cv::Mat转换为unsigned char 数组、un

    2024年02月13日
    浏览(54)
  • std::list和std::vector删除指定下标的元素

    list和vector都可以使用erase函数移除指定下标的元素,注意输入的是迭代器,返回值为指向下一个元素的位置。: 如果下标是index,直接调用即可: 如果根据下标一次性删除多个元素,则会发生错误,因为删除一个元素后,元素个数会发生变化,因此下标就会出现错误,正确代

    2024年02月11日
    浏览(56)
  • 不要轻易定义指向std::vector中的元素的指针

    类应该是被封装的,类的用户通过接口使用类提供的功能,而不必关心类的内部如何实现。然而,C++标准库容器 std::vector 的实现渗透到了接口中来。对于以下代码: 我们初始化了一个有3个int元素的vector,定义了一个int 指针p,指向v[1] , 打印 *p 以及v[1] 的值。 然后向 v 中pu

    2024年02月05日
    浏览(41)
  • VS+Opencv出现:位于 OpenCVTest.exe 中有未经处理的异常: Microsoft C++ 异常: std::bad_alloc,位于内存位置 0x0000003898FBEC70处

    0x00007FF98F394F69 处(位于 OpenCVTest.exe 中)有未经处理的异常: Microsoft C++ 异常: std::bad_alloc,位于内存位置 0x0000003898FBEC70 处。 [ WARN:0@0.111] global c:buildmaster_winpack-build-win64-vc15opencvmodulesimgcodecssrcloadsave.cpp (239) cv::findDecoder imread_(\\\'   C:UsersAdministratorsourcereposOpenCVTestx64DebugOpe

    2024年02月03日
    浏览(48)
  • 【ZYNQ 开发】AMP双arm核交互 - 环境搭建(1)

    目录 1. 实验目的: 2. 实验原理介绍: 2.1 什么是AMP? 2.2  实验的功能框图: 3. 实验流程: 3.1 无中断的连续通信(1) 3.2 软中断通信(2) 3.3 硬中断通信(3) 3.4 AXI_LITE双口ram的建立(4) 4. 实验过程 4.1 创建amp环境及CPU的FSBL 4.2 创建CPU0的app应用程序 4.3 创建CPU1的app应用程序

    2024年02月21日
    浏览(38)
  • 如何将size_type强制转换成为int?Comparison of integers of different signs: ‘int‘ and ‘std::vector::size_type‘

    这是一个编译器的警告信息,意味着在比较两个不同类型的数据时,可能会导致一些问题。 具体来说,在mainwindow.cpp文件的第270行,有一个比较操作,将一个整数(int)和一个容器std::vectorQLabel *::size_type进行比较。容器的size_type类型是一个无符号整数(unsigned long),它的取值范围

    2024年02月15日
    浏览(50)
  • C++面试八股文:用过std::set/std::map吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第27面: 面试官:用过 std::set/std::map 吗? 二师兄:用过。 面试官:能介绍一下二者吗? 二师兄: std::set 是一个有序的集合,其中的元素是唯一的,即每个元素只能出现一次。一般用于去重和自动排序。 二师兄: std::map 同样是

    2024年02月11日
    浏览(55)
  • C++并发编程:std::future、std::async、std::packaged_task与std::promise的深度探索

    1.1 并发编程的概念 (Concept of Concurrent Programming) 并发编程是一种计算机编程技术,其核心在于使程序能够处理多个任务同时进行。在单核处理器上,虽然任何给定的时间只能运行一个任务,但通过任务切换,可以创建出并发执行的效果。而在多核处理器上,可以真正同时处理

    2024年02月05日
    浏览(36)
  • C++ std::future

    std::future是用来接收一个线程的执行结果的,并且是一次性的。 future可以关联一个共享状态,共享状态是用来储存要执行结果的。这个结果是async、promise、packaged_task设置的,且这个结果只能设置一次。 创建future有四种方式  直接构造函数创建,这种创建的future没用共享状态

    2024年02月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包