【STL】C++ vector基本使用

news2024/11/18 15:41:06

目录

一 vector常见构造

1 空容器构造函数(默认构造函数)

2 Fill 构造函数

3 Range 构造函数

4 拷贝构造函数

5 C++11构造

二 vector迭代器

1 begin && end

2 rbegin && rend

3 补充排序

三 vector 容量操作

1 size

2 resize

3 capacity

4 测试1

5 empty 

6 reserve

7 shrink_to_fit

8 注意

四 vector 修改操作

1 assign

2 push_back

3 pop_back

4 insert

5 erase

6 swap 

7 clear

五  vector 元素访问

1 operator [ ]

2 at

3 front && back

4 find

六 总结


一 vector常见构造

1 空容器构造函数(默认构造函数)

构造一个没有元素的空容器。

2 Fill 构造函数

构造一个包含 n 个元素的容器。每个元素都是 val 的副本。

3 Range 构造函数

构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都按相同的顺序从该范围中的相应元素构造而成。

4 拷贝构造函数

构造一个容器,其中包含 x 中每个元素的副本,顺序相同。

#include<iostream>
#include<vector>
using namespace std;

int main()
{
       vector<int> a;
       vector<int> b(4, 100);//也可以只写4 构造大小和容量为4并且初始化值为0的vector
       vector<int> c(b.begin(), b.end());
       vector<int> d(b);

       for (size_t i = 0; i < b.size(); i++)
       {
              cout << b[i] << ' ';
       }
       cout << endl;

       for (size_t i = 0; i < c.size(); i++)
       {
              cout << c[i] << ' ';
       }
       cout << endl;

       for (size_t i = 0; i < d.size(); i++)
       {
              cout << d[i] << ' ';
       }
       cout << endl;

       a = d;//赋值拷贝
       for (size_t i = 0; i < d.size(); i++)
       {
              cout << d[i] << ' ';
       }

       return 0;
}

迭代器构造能否和string产生联系?

void Test2()
{
       string s("123456");
       vector<int> v(s.begin(), s.end());
       for (auto e : v)
       {
              cout << e << " ";
       }
}

int main()
{
       //Test1();
       Test2();
       return 0;
}

这里的字符1 2 3 4 5 6 对应的ASCII的值 

5 C++11构造

vector<int> v1 = { 1,2,3,4,5 };
vector<int> v2{ 1,2,3,4,5 };
vector<int> v3({ 1,2,3 });

二 vector迭代器

这里只演示用法, 不做过多讲解

1 begin && end

iterator begin();const_iterator begin() const;
iterator end();const_iterator end() const;
void Test3()
{
       vector<int> v(4, 1);
       vector<int>::iterator it = v.begin();
       while (it != v.end())
       {
              cout << *it << ' ';
              ++it;
       }
       cout << endl;

       const vector<int> vv(4, 10);
       vector<int>::const_iterator itt = vv.begin();
       while (itt != vv.end())
       {
              cout << *itt << ' ';
              ++itt;
       }
       
}

2 rbegin && rend

reverse_iterator rbegin();const_reverse_iterator rbegin() const;
reverse_iterator rend();const_reverse_iterator rend() const;
void Test4()
{
       vector<int> v(5);
       vector<int>::reverse_iterator it = v.rbegin();
       int i = 1;
       while (it != v.rend())
       {
              *it += i;
              ++it;
              ++i;
       }
       for (auto e : v)
       {
              cout << e << ' ';
       }

}

这个大家就想成和begin && end 相反就行, 没啥难度

 

3 补充排序

#include<algorithm>

sort(v1.begin(), v1.end()); // 升序
sort(v1.begin(), v1.end(), greater<int>()); // 降序

三 vector 容量操作

 这里就讲常用的, 大家看明白意思就可以直接上手, 没啥难度的

1 size

返回容器中的元素数。

size_type size() const noexcept;

2 resize

调整容器的大小,使其包含 n 个元素。

void resize (size_type n);void resize (size_type n, const value_type& val);

调整容器的大小,使其包含 n 个元素。

如果 n 小于当前容器大小(size),则内容将减少到其前 n 个元素,删除超出的元素(并销毁它们)。

如果 n 大于当前容器大小,则通过在末尾插入任意数量的元素来扩展内容,以达到 n 的大小。如果指定了 val,则新元素将初始化为 val。

如果 n 也大于当前容器容量(capacity),则会自动重新分配分配的存储空间。size 和 capacity都要改变

请注意,此函数通过插入或擦除容器中的元素来更改容器的实际内容

3 capacity

分配的存储容量的返回大小

此容量不一定等于向量大小。它可以相等或更大,额外的空间可以容纳增长,而无需在每次插入时重新分配。

size_type capacity() const;

4 测试1

void Test5()
{
       vector<int> v(5, 10);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.resize(2);
       cout << v.size() << endl;
       cout << v.capacity() << endl;
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.resize(4, 10);
       cout << v.size() << endl;
       cout << v.capacity() << endl;
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.resize(10);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

}

5 empty 

返回向量是否为空(即其大小是否为 0)。

bool empty() const;

6 reserve

void reserve (size_type n);

请求容器容量至少足以包含 n 个元素。

如果 n 大于当前容器容量,则该函数会导致容器重新分配其存储,从而将其容量增加到 n(或更大)。

在所有其他情况下,函数调用不会导致重新分配,并且容器容量不受影响。

此函数对容器大小(size)没有影响,并且不能更改其元素。

void Test6()
{
       vector<int> v(5, 10);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.reserve(1);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.reserve(100);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.reserve(50);
       cout << v.size() << endl;
       cout << v.capacity() << endl;
}

7 shrink_to_fit

 请求容器减小其容量以适合其大小。

void shrink_to_fit();
void Test7()
{
       vector<int> v(4, 100);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.reserve(100);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.shrink_to_fit();
       cout << v.size() << endl;
       cout << v.capacity() << endl;
}

8 注意

capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。

这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。

resize在开空间的同时还会进行初始化,影响size.

四 vector 修改操作

有些用法我没有演示出来, 因为实际应用的时候基本用不到, 大家如果感兴趣也可以查阅文档, 非常容易上手 

1 assign

为容器分配新内容,替换其当前内容,并相应地修改其大小

range(1)
template <class InputIterator>  void assign(InputIterator first, InputIterator last);

fill(2)
void assign(size_type n, const value_type& val);

initializer list(3)
void assign(initializer_list<value_type> il);
void Test8()
{
       vector<int> a(5, 10);
       cout << a.size() << endl;
       cout << a.capacity() << endl;

       a.assign(6, 1);
       for (auto e : a)
       {
              cout << e << ' ';
       }
       cout << endl;
       cout << a.size() << endl;
       cout << a.capacity() << endl;

       vector<int> b;
       b.assign(a.begin(), a.end() - 1);
       for (auto e : b)
       {
              cout << e << ' ';
       }
}

2 push_back

在容器末尾的当前最后一个元素之后添加一个新元素。val 的内容被复制(或移动)到新元素。

void push_back (const value_type& val);
void push_back (value_type&& val);
void Test9()
{
       vector<int> v(4);
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);
       for (auto e : v)
       {
              cout << e << ' ';
       }
}

3 pop_back

删除容器中的最后一个元素,从而有效地将容器大小减小 1。

void pop_back();

4 insert

过在指定位置的元素之前插入新元素来扩展容器,从而有效地通过插入的元素数增加容器大小

single element(1)
iterator insert(const_iterator position, const value_type& val);

fill(2)
iterator insert(const_iterator position, size_type n, const value_type& val);

range(3)
template <class InputIterator>iterator insert(const_iterator position, InputIterator 
first, InputIterator last);

move(4)
iterator insert(const_iterator position, value_type&& val);

initializer list(5)
iterator insert(const_iterator position, initializer_list<value_type> il);
void Test10()
{
       vector<int> v(4, 10);
       v.insert(v.begin(), 100);
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.insert(v.end(), 4, 100);
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;
}

5 erase

从容器中删除单个元素 (position) 或一系列元素 ( [first,last))

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
void Test11()
{
       vector<int> v;
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);
       v.push_back(4);
       v.erase(v.begin());
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.erase(v.begin(), v.begin()+2);
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;
}

6 swap 

通过 x 的内容交换容器的内容,x 是另一个相同类型的容器对象。size可能有所不同。

void swap (vector& x);
void Test12()
{
       vector<int> v1(4, 10);
       for (auto e : v1)
       {
              cout << e << ' ';
       }
       cout << endl;

       vector<int> v2(4, 1);
       v1.swap(v2);
       for (auto e : v1)
       {
              cout << e << ' ';
       }
       cout << endl;
}

7 clear

从容器中删除所有元素(这些元素被销毁),使容器的大小为0。

void clear() noexcept;
void Test13()
{
       vector<int> v(1, 4);
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.clear();
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;
}

五  vector 元素访问

 

1 operator [ ]

reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
void Test14()
{
       vector<string> v;
       v.push_back("hello");
       v.push_back("world");

       cout << v[0] << endl;
       cout << v[1] << endl;

       cout << v[0][1] << endl;
       cout << v[0][2] << endl;
}

2 at

返回对容器中位置 n 处的元素的引用。

该函数会自动检查 n 是否在容器中有效元素的范围内,如果不是,则抛出out_of_range异常(即,如果 n 大于或等于其大小)。这与成员 operator[] 形成鲜明对比,后者不检查边界。

void Test15()
{
       vector<int> v;
       v.push_back(1);
       v.push_back(2);
       
       cout << v[0] << endl;
       cout << v.at(0) << endl;     
}

3 front && back

void Test16()
{
       vector<int> v;
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);

       cout << v.front() << endl;
       cout << v.back() << endl;
}

4 find

template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)

在迭代器范围内寻找val, 如果 没找到, 那就返回v.end() 

void Test17()
{
       vector<int> v;
       v.push_back(1);
       v.push_back(3);
       v.push_back(2);
       v.push_back(0);

       vector<int>::iterator pos = find(v.begin(), v.end(), 2);
       if (pos != v.end())
       {
              v.insert(pos, 300);
       }
       for (auto e : v)
       {
              cout << e << ' ';
       }

}

 另一个测试:

int main()
{
       vector<int> v(1);
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);
       v.push_back(4);
       vector<int>::iterator pos = find(v.begin(), v.end(), 9);
       v.insert(pos, 100);
       for (auto e : v)
       {
              cout << e << ' ';
       }

       return 0;

六 总结

好久没写博客了, 非常的抱歉. 很长一段时间都在学习Linux, 还是比较困难的. 中间也有一段时间摆烂. 幸好又复活过来了. 感谢所有支持我的人的陪伴吧!

vector这节用法非常简单的, 如果大家感觉概念和理解还是差点意思的话, 一定看看我前面写的 string, 里面对一些概念进行了详细讲解, 当然后续我也会出简单的模拟实现, 大家看了底层, 就更容易懂了. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1699853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程信号(1)

目录 一、信号 1.1、生活中的信号 1.2、Linux中的信号 二、信号处理常见方式 三、信号的产生 3.1、简单理解信号的保存和发送 3.2、键盘产生信号 3.3、核心转储 3.4、系统调用接口产生信号 3.4.1、kill 3.4.2、raise 3.4.3、abort 3.5、软件条件产生信号 3.6、硬…

【操作系统】发展与分类(手工操作、批处理、分时操作、实时操作)

2.操作系统发展与分类 思维导图 手工操作阶段&#xff08;此阶段无操作系统&#xff09; 需要人工干预 缺点&#xff1a; 1.用户独占全机&#xff0c;资源利用率低&#xff1b; 2.CPU等待手工操作&#xff0c;CPU利用不充分。 批处理阶段&#xff08;操作系统开始出现&#x…

firewalld 防火墙

firewalld概述 Linux系统防火墙从CentOS7开始的默认防火墙工作在网络层&#xff0c;属于包过滤防火墙 Firewalld和iptables的关系 netfilter 位于Linux内核中的包过滤功能体系称为Linux防火墙的“内核态” firewalld Centos默认的管理防火墙规则的工具称为防火墙的“用…

【C++】右值引用 移动语义

目录 前言一、右值引用与移动语义1.1 左值引用和右值引用1.2 右值引用使用场景和意义1.3 右值引用引用左值及其一些更深入的使用场景分析1.3.1 完美转发 二、新的类功能三、可变参数模板 前言 本篇文章我们继续来聊聊C11新增的一些语法——右值引用&#xff0c;我们在之前就已…

sqli-lib4-6关教程

SERIES-4 输入?id1 输入?id2-1&#xff0c;说明该数据类型为字符型 输入?id1’ 输入?id1"&#xff0c;说明闭合符号为" 输入?id1")– 输入?id1") order by 3– 输入?id1") order by 4– 数据共三列&#xff0c;输入?id-1") union selec…

InfLLM的笔记

文件中提供的代码是一个Python函数chat_loop&#xff0c;它是聊天系统的核心循环。以下是对这段代码逻辑的梳理&#xff1a; 函数定义与参数 chat_loop函数接收多个参数&#xff0c;用于配置聊天模型和聊天环境。参数包括模型路径、设备类型、GPU数量、最大GPU内存、数据类型…

K8s的kubectl的基本操作

K8s的kubectl的基本操作 K8s基本信息的查看 查看版本信息 kubectl versio查看资源对象简写 kubectl api-resources查看集群信息 kubectl cluster-info配置kubectl自动补全 source <(kubectl completion bash)查看master节点状态 kubectl get cs查看命名空间 kubectl…

Elastic Cloud 将 Elasticsearch 向量数据库优化配置文件添加到 Microsoft Azure

作者&#xff1a;来自 Elastic Serena Chou, Jeff Vestal, Yuvraj Gupta 今天&#xff0c;我们很高兴地宣布&#xff0c;我们的 Elastic Cloud Vector Search 优化硬件配置文件现已可供 Elastic Cloud on Microsoft Azure 用户使用。 此硬件配置文件针对使用 Elasticsearch 作…

<el-table>根据后端返回数据决定合并单元格的数量(521特别版)

文章目录 一、需求说明二、用到的方法三、代码&#xff08;只展示了本文章重点代码&#xff09; 一、需求说明 &#x1f49d;仅合并第一列&#xff0c;其余为固定列 二、用到的方法 &#x1f48c;合并单元格可以采用三种方法 &#x1f495;1. 手写表格 简单 但没有饿了么写…

力扣HOT100 - 136. 只出现一次的数字

解题思路&#xff1a; class Solution {public int singleNumber(int[] nums) {int single 0;for (int num : nums) {single ^ num;}return single;} }

生命在于学习——Python人工智能原理(1.1)

说明&#xff1a;今年学一部分人工智能方向的知识&#xff0c;网安也会穿插&#xff0c;看后续如何将二者结合起来。 一、人工智能的基本知识 1、人工智能的起源 1956年美国达特茅斯学院召开了一个夏季论班&#xff0c;首次提出人工智能的概念。 1950年图灵提出了图灵测试&a…

Jenkins + github 自动化部署配置

1 Jenkins安装 AWS EC2安装Jenkins&#xff1a;AWS EC2 JDK11 Jenkins-CSDN博客 AWS EC2上Docker安装Jenkins&#xff1a;https://blog.csdn.net/hhujjj2005/article/details/139078402 2 登录jenkins http://192.168.1.128:8080/ $ docker exec -it d1851d9e3386 /bin/ba…

ChatGPT-4o 实战 如何快速分析混淆加密和webpack打包的源码

ChatGPT-4o 几个特点 一个对话拥有长时间的记忆&#xff0c;可以连续上传文件&#xff0c;让其分析&#xff0c;最大一个代码文件只能3M&#xff0c;超出3M的文件&#xff0c;可以通过split-file可以进行拆分 其次ChatGPT-4o可以生成文件的下载链接&#xff0c;这有利于大文件的…

Nginx 的原理解析 worker 配置及相关问题 -细节狂魔

文章目录 前言Nginx 的最基本的执行过程&#xff08;master & worker&#xff09;worker 是如何进行工作的 一个 master 和 多个 woker 有哪些好处1、可以使用 nginx 热部署2、节省资源 && worker 进程之间互不影响 && nginx 服务不会中断 woker 设置多少才…

如何查看哪些组策略应用于你的电脑和用户帐户?这里有详细步骤

如果你希望在电脑上查看所有有效的组策略设置,以下是操作方法。 什么是Windows中的组策略 在Windows世界中,组策略为网络管理员提供了一种将特定设置分配给用户组或计算机组的方法。然后,无论何时组中的用户登录到联网的PC,或无论何时启动组中的PC,都会应用这些设置。 …

Linux系统之GoAccess实时Web日志分析工具的基本使用

Linux系统之GoAccess实时Web日志分析工具的基本使用 一、GoAccess介绍1.1 GoAccess简介1.2 GoAccess功能1.3 Web日志格式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统镜像源3.4 更新软件列表…

【课程作业】嵌入式系统与设计上机作业(作业三)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

基于机器学习判断面部微表情发现哪些人更容易诊有帕金森病

1. 概述 帕金森病&#xff08;Parkinson’s disease&#xff0c;PD&#xff09;是一种慢性、进展性的神经退行性疾病&#xff0c;主要影响运动系统。该病症以大脑中黑质致密部多巴胺能神经元的逐渐丧失为特征&#xff0c;导致多巴胺&#xff08;一种重要的神经递质&#xff09…

XX数字中台技术栈及能力

XX数字中台技术栈及能力 1 概述 XX数字中台面向数据开发者、数据管理者和数据应用者&#xff0c;提供数据汇聚、融合、治理、开发、挖掘、共享、可视化、智能化等能力&#xff0c;实现数据端到端的全生命周期管理&#xff0c;以共筑数字基础底座&#xff0c;共享数据服务能力…

插入排序(概述)

描述 插入排序为将一个数插入到以排序好的数组中 目录 描述 原理 特性 代码 原理 我们以升序为例 先将新数插入到数组的最后一位&#xff0c;记录下新数的值 从新数的位置开始往前遍历&#xff0c;如果前一位大于新数的值 则将当前位置修改为前一位的值 如果前一位小…