vector类的使用

news2024/9/24 11:27:22

目录

​一、vector类的组织形式

二、vector类的成员函数

1.默认成员函数

(1)构造函数、拷贝构造函数

(2)析构函数和赋值运算符重载

2.容量操作

3.迭代器(iterator)

4.元素访问

5.修改操作


一、vector类的组织形式

vector是可变大小的序列容器,底层组织为顺序表,大小可变,数据类型自由,也可以采用下标对vector的元素进行访问。

这是cplusplus网站上vector的介绍:

下面我将介绍vector的常用接口

二、vector类的成员函数

1.默认成员函数

在成员函数的第一部分就是string的三个默认成员函数,从上到下为构造函数、拷贝构造函数、析构函数和赋值运算符重载

(1)构造函数、拷贝构造函数

vector的构造与拷贝构造函数常用的有以下四个:

vector();——————不传参的默认构造,构造空vector对象,相当于空的顺序表

vector(size_type n, const value_type& val = value_type());——————构造一个vector并插入n个value_type类型的默认构造变量。

vector (const vector& x);——————拷贝构造一个vector变量

vector (InputIterator first, InputIterator last);——————用另一个自定义类型变量(这里的变量的类型不一定是vector)的迭代器的两个位置为头尾,初始化这个vector变量

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1;
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    
    vector<int> v2(10, 1);
    for (auto e : v2)
    {
        cout << e;
    }
    cout << endl;
    
    vector<int> v3(v2);
    for (auto e : v3)
    {
        cout << e;
    }
    cout << endl;
    
    vector<int> v4(v2.begin(), v2.end());
    for (auto e : v4)
    {
        cout << e;
    }
    cout << endl;
    
    string s = "hello world";
    vector<char> v5(s.begin(), s.end());
    for (auto e : v5)
    {
        cout << e;
    }
    cout << endl;
    return 0;
}

测试结果:

(2)析构函数和赋值运算符重载

析构函数不可重载的特性只有一个:~vector(),一样直接释放空间,指针置空即可。

vector& operator= (const vector& x);——————将x的内容赋值给左侧变量,没什么好讲的。

2.容量操作

容量操作包含以下内容:

size_t size() const;——————返回vector有效数据的数目

size_t max_size() const;——————返回vector可储存数据的数量上限,此接口在使用中没有意义

void resize (size_t n, value_type val = value_type());——————改变空间大小,若新空间大于旧空间插入对应字符,小于则直接截断

size_t capacity() const;——————返回已开辟空间足够储存多少个元素

bool empty() const;——————检测当前vector是否为空

void reserve (size_t n);——————如果n值大于当前的空间大小,便扩大空间到n个字符,小于则不做改变。

void shrink_to_fit();——————将vector的容量缩小到有效数据的大小

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1(5, 1);
    cout << v1.size() << endl;
    cout << v1.capacity() << endl;
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    v1.resize(10, 3);
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    cout << v1.empty() << endl;
    v1.reserve(20);
    cout << v1.size() << endl;
    cout << v1.capacity() << endl;
    return 0;
}

 测试结果:

3.迭代器(iterator)

vector同样有两个迭代器:正向和反向迭代器

vector的正向迭代器

iterator begin();——————vector的头,可读可写

const_iterator begin() const;——————vector的头,只读

iterator end();——————vector的尾,可读可写

const_iterator end() const;——————vector的尾,只读

vector的反向迭代器

reverse_iterator rbegin();——————vector的逆向的头,可读可写

const_reverse_iterator rbegin() const;——————vector的逆向的头,只读

reverse_iterator rend();——————vector的逆向后的尾,可读可写

const_reverse_iterator rend() const;——————vector的逆向的尾,只读

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    vector<int>::iterator it1 = v1.begin();
    while (it1 != v1.end())
    {
        printf("%d", *it1);
        it1++;
    }
    cout << endl;
    vector<int>::reverse_iterator it2 = v1.rbegin();
    while (it2 != v1.rend())
    {
        printf("%d", *it2);
        it2++;
    }
    cout << endl;
    vector<int>::iterator it3 = v1.begin();
    while (it3 != v1.end())
    {
        *it3 = 1;
        it3++;
    }
    it3 = v1.begin();
    while (it3 != v1.end())
    {
        cout << *it3;
        it3++;
    }
    cout << endl;
    return 0;
}

测试结果:

4.元素访问

operator[]——————直接重载[]使s[i]就可以直接访问对应下标元素,而且也加上了越界的检查,提高了程序的安全性。

reference operator[] (size_t n);——————可读可写

const_reference operator[] (size_t n) const;——————只读

at函数——————与[]作用相同

reference at (size_t n);——————可读可写

const_reference at (size_t n) const;——————只读

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    vector<int>::iterator it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    cout << v1[1] << endl;
    cout << v1.at(1) << endl;
    v1[1] = 6;
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    return 0;
}

测试结果:

5.修改操作

assign——————将原本的内容删除然后放入相应数据

template

void assign (InputIterator first, InputIterator last);——————将对象通过另一个对象的迭代器赋值

void assign (size_t n, const value_type& val);——————赋值对象为含有n个val对象的vector

void push_back(char c);——————尾插变量

void push_back(char c);——————尾插变量

insert——————在特定位置插入内容

iterator insert (iterator position, const value_type& val);——————在position的迭代器位置插入val变量

void insert (iterator position, size_t n, const value_t& val);——————在position的迭代器位置开始插入n个val变量

template

void insert (iterator position, InputIterator first, InputIterator last);——————在position的迭代器位置插入迭代器从first位置到last位置的内容

erase——————清除内容

iterator erase (iterator position);——————清除position的迭代器位置的内容

iterator erase (iterator first, iterator last);——————清除从first到last的迭代器位置的所有内容

void clear();——————清除string的内容为空字符串,但不释放空间

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    //template <class InputIterator>
    //void assign(InputIterator first, InputIterator last);
    //    void assign(size_t n, const value_type& val);
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    vector<int>::iterator it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    
    vector<int> v2;
    v2.assign(v1.begin() + 1, v1.end() - 1);
    for (auto e : v2)
    {
        cout << e;
    }
    cout << endl;

    vector<int> v3;
    v3.assign(4, 1);
    for (auto e : v3)
    {
        cout << e;
    }
    cout << endl;
    
    //iterator insert(iterator position, const value_type& val);
    //void insert(iterator position, size_t n, const value_t& val);
    //template <class InputIterator>
    //    void insert(iterator position, InputIterator first, InputIterator last);
    v1.insert(v1.begin(), 1);
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;

    v1.insert(v1.end(), 4, 7);
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;

    v1.insert(v1.begin(), v2.begin(),v2.end());
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;

    //iterator erase(iterator position);
    //iterator erase(iterator first, iterator last);
    v1.erase(v1.begin());
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;

    v1.erase(v1.begin(), v1.end());
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    return 0;
}

测试结果:

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

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

相关文章

web3调研:Dusk Network调研

在此声明&#xff0c;仅做分享&#xff0c;绝不存在倡导炒币行为 原文链接&#xff1a;Dusk 调研报告 web3产品调研系列 1、web3调研&#xff1a;Iron fish调研 2、web3调研&#xff1a;Dusk Network调研 目录web3产品调研系列一、背景概述二、项目介绍2.1 创始团队2.2 项目融…

【数据结构】三万字图文讲解带你手撕八大排序(附源码)

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 文章目录一、前言二、排序的概念和运用三、八大排序讲解及实现1、直接插入排序1.1 排序思路1.2 代…

Java重点源码回顾——ConcurrentHashMap1.7

1. 概述 HashMap在我们的日常生活中使用很多&#xff0c;但是它不是线程安全的。我们可以使用HashTable来代替&#xff0c;主要实现方式是在方法中加入synchronized&#xff0c;所以效率也比较低。因此&#xff0c;对于键值对&#xff0c;我们可以尝试使用ConcurrentHashMap来…

《Java 后端面试经》微服务篇

《Java 后端面试经》专栏文章索引&#xff1a; 《Java 后端面试经》Java 基础篇 《Java 后端面试经》Java EE 篇 《Java 后端面试经》数据库篇 《Java 后端面试经》多线程与并发编程篇 《Java 后端面试经》JVM 篇 《Java 后端面试经》操作系统篇 《Java 后端面试经》Linux 篇 《…

关于Linux 网络抓包的一些笔记整理

写在前面 遇到一个 ping 单通 的情况&#xff0c;需要抓包分析下&#xff0c;所以整理这部分笔记博文内容涉及&#xff1a; HTTP/TCP 抓包分析 DemoICMP 抓包分析 DemoNginx 抓包分析用户名密码 Demo 理解不足小伙伴帮忙指正 这世界的存在完全只是就它对一个其他事物的&#xf…

【自学Java】Java选择结构if

Java选择结构if Java语言if条件判断 在 Java 中&#xff0c;关键字 if 是用于测试某个条件&#xff08;布尔型或逻辑型&#xff09;的语句是否满足一定的条件&#xff0c;如果满足特定的条件&#xff0c;则会执行 if 后面的大括号 {} 括起来的代码块&#xff0c;如果没有代码…

hnu社交网络分析作业2

前言&#xff1a;前言&#xff1a;上的是林剑新老师的课程&#xff0c;还是比较有意思的&#xff0c;此博客用来记录作业的学习情况&#xff0c;答案为老师提供的 一、2 跳标签索引是一种在网络中进行距离查询时广泛使用的技术。算法 1 描述了一种在无向图中构造 2 跳标签索引…

Java 接口介绍和使用

1.什么是接口&#xff1f; 接口就是给出一些没有实现的方法&#xff0c;封装到一起&#xff0c;当某一个类要使用的时候再实现出来。 2.接口的语法 interface name{ attributes methods } 比如如下USB接口 public interface Usb {public void start();public void s…

Vue 中 CSS scoped 的原理

前言 在日常的Vue项目开发过程中&#xff0c;为了让项目更好的维护一般都会使用模块化开发的方式进行。也就是每个组件维护独立的template&#xff0c;script&#xff0c;style。主要介绍一下使用<style scoped>为什么在页面渲染完后样式之间并不会造成污染。 示例 搭…

FreeRTOS开发指南

1&#xff1a;任务模板 //任务优先级 #define XXX_TASK_PRIO 1 //任务堆栈大小 #define XXX_STK_SIZE 128 //任务句柄 TaskHandle_t XXXTask_Handler NULL; /* * 放在开始任务&#xff0c;只需要执行一次为了创建任务 */ void Create_XXX_Task(void) {BaseType_t xR…

编码器-解码器架构

“编码器&#xff0d;解码器”架构可以将长度可变的序列作为输入和输出&#xff0c;因此适用于机器翻译等序列转换问题。 编码器将长度可变的序列作为输入&#xff0c;并将其转换为具有固定形状的编码状态。 解码器将具有固定形状的编码状态映射为长度可变的序列。 机器翻译是…

2022 年我国的对外贸易行业发展如何?

2021年&#xff0c;在各种不确定因素的影响下&#xff0c;中国外贸人依然以其强大的韧性和实力取得了新的进出口成绩。去年进出口总值创历史新高&#xff0c;达到6.05万亿美元&#xff0c;一年内分别突破5万亿美元和6万亿美元。 在2021年成绩和经验的加持下&#xff0c;今年外…

SpringBoot+VUE前后端分离项目学习笔记 - 【08 SpringBoot实现分页查询】

手动实现分页功能 先理解分页查询原理 采用limit语句来实现分页 -- 页码PageNum 每页数据条目PageSize5 -- 第一页 PageNum0, limit 0,5 SELECT * FROM sys_user limit 0,5; -- 第二页 PageNum1, limit 5,5 SELECT * FROM sys_user limit 5,5; -- 公式&#xff1a; limit …

Python压缩模块:bz2

文章目录基本原理调用基本原理 bz2和zlib的功能是基本一致的&#xff0c;只是算法不同。zlib模块此前已经总结了&#xff1a;zlib模块详解 bz2模块用到的压缩算法是bzip2算法&#xff0c;其核心是BW变换和MTF变换&#xff0c;当然最后少不了霍夫曼编码。 BWT&#xff0c;即B…

Qt RSA OpenSSL C++ Qt加密解密签字通信系统窗体源码

程序示例精选 Qt RSA OpenSSL C Qt加密解密签字通信系统窗体 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Qt RSA OpenSSL C Qt加密解密签字通信系统窗体>>编写代码&#xff0c…

年终回顾 | 小米技术最受欢迎的技术文章TOP20

转眼间&#xff0c;小米技术已经陪伴大家度过了一整个年头。在一年里&#xff0c;我们始终坚持为大家提供有趣好玩的技术科普、硬核前沿的技术干货&#xff0c;带给大家一切有关小米的新鲜技术创新内容。2023年就要到了&#xff0c;欢迎你点击文末左下角的“阅读原文”填写一份…

Vue3:搜索框输入防抖实现整理笔记

目录 场景需求 前言 防抖 & 节流 防抖 节流 输入防抖存在的问题 指令实现 总结 在Vue开发中&#xff0c;遇到了搜索框输入防抖处理&#xff0c;算是防抖的使用场景之一吧&#xff0c;抽象其逻辑记录下来以备后用 场景需求 作为开发人员&#xff0c;一定要先搞清楚…

Android---Material Design

目录 一、什么是Material Design Z轴 Material Design 的一些 theme 一、什么是Material Design Material Design 中文名&#xff1a;材料设计语言&#xff0c;是由 Google 推出的全新的设计语言。Google 表示&#xff0c;这种设计语言旨在为手机、平板、台式机和“其它平台”…

标签平滑(Label Smoothing)详解

一、什么是label smoothing&#xff1f; 标签平滑&#xff08;Label smoothing&#xff09;&#xff0c;像L1、L2和dropout一样&#xff0c;是机器学习领域的一种正则化方法&#xff0c;通常用于分类问题&#xff0c;目的是防止模型在训练时过于自信地预测标签&#xff0c;改善…

spring6笔记2( ioc、bean的作用域、工厂模式、bean的四种实例化方式,生命周期)

第四章、Spring对ioc的实现 4.4 p命名空间注入 目的&#xff1a;简化配置。 使用p命名空间注入的前提条件包括两个&#xff1a; 第一&#xff1a;在XML头部信息中添加p命名空间的配置信息&#xff1a;xmlns:p"http://www.springframework.org/schema/p"第二&…