【C++】vector(下)--下篇

2024-09-02 08:04
文章标签 c++ 下篇 vector

本文主要是介绍【C++】vector(下)--下篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
个人主页~

vector(上)~

vector(下)–上篇~


vector

  • 二、模拟实现
    • 3、test.cpp
      • test1
      • test2
      • test3
      • test4
      • test5
      • test6
  • 三、一个难题

二、模拟实现

3、test.cpp

test1

这个没啥好说的,就是尾插和迭代器都能正常使用

//测尾插和迭代器
void test1()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (size_t i = 0; i < v.size(); i++){std::cout << v[i] << " ";}std::cout << std::endl;vector<int>::iterator it = v.begin();while (it != v.end()){*it *= 10;std::cout << *it << " ";++it;}std::cout << std::endl;for (auto e : v){std::cout << e << " ";}std::cout << std::endl;
}

在这里插入图片描述

test2

这个测试有两部分,第一部分就是被注释掉的这一部分,第二部分就是剩下的部分

void test2()
{/*int i = 0;int j(1);int k = int(2);*/vector<int*> v1;v1.resize(5);vector<std::string> v2;//v2.resize(10, string("xxx"));//匿名对象v2.resize(10, "xxx");//隐式类型转换for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;for (auto e : v2){std::cout << e << " ";}std::cout << std::endl;
}

在这里插入图片描述
关于第一部分,这段代码都是内置类型,它们也与类模板的初始化方式相同,这是因为T可以是任意的类型,当然也可以是int、double等内置类型,所以这里的构造遵从类模板

第二部分就是resize的测试,这里v1的类型是vector<int*>也就是相当于是指针数组

test3

测试insert

void test3()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;vector<int>::iterator it = v.begin() + 2;v.insert(it, 30);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;//v.insert(v.begin(), 30);//这是头插v.insert(v.begin() + 3, 30);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;
}

在这里插入图片描述
这里可以清楚地看到迭代器的加上一个数的效果以及insert效果的实现

test4

测试erase

void test4()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;auto pos = v.begin();v.erase(pos);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;v.erase(v.begin() + 3);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;
}

在这里插入图片描述
这也没啥好说的,就是erase的效果实现

test5

测试拷贝构造函数

void test5()
{vector<int> v1;v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);vector<int> v2(v1);for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;for (auto e : v2){std::cout << e << " ";}std::cout << std::endl;vector<int> v3;v3.push_back(10);v3.push_back(20);v3.push_back(30);v3.push_back(40);v1 = v3;for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;
}

在这里插入图片描述

test6

reverse和resize

void test6()
{vector<int> v1;v1.reserve(10);v1.resize(20, 0);v1.resize(10, 1);
}

我们可以通过调试来观察这两个成员函数的行为

在这里插入图片描述
此时start和finish相同,endofstorage减去start换算为十进制就是40,也就刚好是10个int,满足reserve的功能,size没有动,只改变了capacity
在这里插入图片描述
此时resize改变了size以及capacity,finish与endofstorage相同,同时我们可以看到这里扩容后地址改变了,也就是说这些指针指向新空间了,同时start位置的值已经成为0,当然start到finish的所有值都是0
在这里插入图片描述
这里可以观察到,finish的位置在start10个int之后,endofstorage的位置在finish的10个int之后,因为操作之前的finish大于start+n(n为resize第一个参数),所以不改变之前的内容

三、一个难题

电话号码的字母组合

我们先把答案写出来然后慢慢梳理

class Solution {const char* numStrArr[10] = {"","","abc","def","ghi","mno","pqrs","tuv","wxyz"};//0~9每个数字所对应的字符串
public:void Combine(const string& digits,int i,string combineStr,vector<string>& ret){if(i == digits.size()){ret.push_back(combineStr);return;}int num = digits[i] - '0';string str = numStrArr[num];for(auto ch: str){Combine(digits,i+1,combineStr+ch,ret);}}vector<string> letterCombinations(string digits) {vector<string> v;if(digits.empty()){return v;}string str;Combine(digits,0,str,v);return v;}
};

这里画了一个简易的过程图
在这里插入图片描述
首先这个函数是一个结合函数,用来组合各个字符,当递归的次数与所键入的数字数相等时,就尾插最后一个字符后返回

num用来记录当前函数处理的是哪个数字,str用来保存当前这个数字所对应的字符串,然后将它们一个一个取出来进行结合

第零层取出2,组合出空字符串,第一层取出5,组合的字符串就是2对应的“a”、“b”、“c”,第二层取出8,组合的字符串为“aj”、“ak”、“al”、“bj”、“bk”、“bl”、“cj”、“ck”、“cl”,第三层时与所键入的数字数相等了,尾插tuv三个字符

题目解析起来很容易看懂,但是自己来做的话很难做,这里就是一个vector与string的结合题目,属于前序遍历类的题目


今日分享结束~

在这里插入图片描述

这篇关于【C++】vector(下)--下篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129429

相关文章

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规