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


个人主页~

vector(上)~

vector(下)--上篇~


vector

二、模拟实现

3、test.cpp

test1

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

cpp 复制代码
//测尾插和迭代器
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

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

cpp 复制代码
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

cpp 复制代码
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

cpp 复制代码
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

测试拷贝构造函数

cpp 复制代码
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

cpp 复制代码
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第一个参数),所以不改变之前的内容

三、一个难题

电话号码的字母组合

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

cpp 复制代码
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的结合题目,属于前序遍历类的题目


今日分享结束~

相关推荐
Nuanyt10 分钟前
Hot 100 刷题笔记 · 数组与哈希专题(3 题)
java·笔记·算法·leetcode·哈希算法·1024程序员节
速德瑞仪器21 分钟前
如何精准把控紫外能量,选择合适的UV能量计
经验分享·紫外辐照计
lazy H41 分钟前
【计算机网络】第 5 篇:TCP 和 UDP 有什么区别?从 Java 后端场景理解两种传输协议
经验分享·后端·网络协议·tcp/ip·计算机网络·1024程序员节
爱读书的小胖1 小时前
LeetCode 274 H 指数 C 语言解题分析
c语言·算法·leetcode·1024程序员节
破芽1 小时前
learn-claude-code-s08-s09-学习笔记
笔记·学习
星恒随风2 小时前
Linux网络编程基础(二):彻底理解局域网通信、MAC与IP地址、数据封装、端口号、网络字节序及Socket接口
linux·网络·笔记·学习·tcp/ip·1024程序员节
思麟呀2 小时前
BTree的原理与 C++ 完整实现
c语言·数据结构·c++·算法·1024程序员节
jimy12 小时前
C++ 中 xvalue 的 identity 存在哪里?和 lvalue 的 identity 有什么区别?
开发语言·c++·1024程序员节
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》Provider分析与实现
开发语言·c++·语言模型
嘻嘻嘻3213 小时前
ICLR2025|MIM‑Refiner:利用预训练掩码图像建模中间表征提升对比学习
学习