【C++】vector的使用

1、vector的使用

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
using namespace std;

void Test1()
{
	vector<int> v1;
	vector<int> v2(10, 15);
	vector<int> v3(v2.begin(), v2.end());

	string str("hello world");
	vector<char> v4(str.begin(), str.end());

	vector<char> v5(v4);

	//[下标]
	for (size_t i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << ' ';
	}
	cout << endl;

	//迭代器
	//vector<char>::iterator it = v4.begin();
	auto it = v4.begin();
	while (it != v4.end())
	{
		cout << *it;
		it++;
	}
	cout << endl;

	//范围for
	for (auto ch : v5)
	{
		cout << ch;
	}
}

void Test2()
{
	vector<int> v;
	//v.reserve(100); //reserve,size没变,还是从0开始
	size_t sz = v.capacity(); //初始容量
	for (int i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "扩容:" << sz << endl;
		}
	}
} 

void Test3()
{
	vector<int> v;
	cout << v.max_size() << endl;

	//v.reserve(100); //error【size = 0    capacity 100】
	v.resize(100);    //【size = 100  capacity 100】【只能操控size以内的数据进行赋值、修改等】
	
	for (size_t i = 0; i < 100; i++)
	{
		v[i] = i;
	}

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

void Test4()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);

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

	//插入
	v1.insert(v1.begin(), 5); //提供的是地址,不是下标,在该位置前插入

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

	//vector没有提供find,直接用算法库里的
	auto it = find(v1.begin(), v1.end(), 3);
	if (it != v1.end()) //【迭代器传区间都是左闭右开】
	{
		v1.insert(it, 30);
	}

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

	//删除
	it = find(v1.begin(), v1.end(), 3);
	if (it != v1.end())
	{
		v1.erase(it);
	}
	
	for (auto e : v1)
	{
		cout << e << ' ';
	}
	cout << endl;
}

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

	cout << "v.size() = " << v.size() << endl;
	cout << "v.capacity() = " << v.capacity() << endl;

	v.clear(); //只清数据(size),不清capacity

	cout << "clear后size = " << v.size() << endl;
	cout << "clear后capacity = " << v.capacity() << endl;
}

int main()
{
	Test5();
	return 0;
}

2、vector的OJ题

(1)二叉树的前序遍历

class Solution
{
public:
    void preorder(TreeNode* root, vector<int>& v)
    {
        if (root == nullptr)
        {
            return;
        }
        v.push_back(root->val);
        preorder(root->left, v);
        preorder(root->right, v);
    }

    vector<int> preorderTraversal(TreeNode* root)
    {
        vector<int> v1;
        preorder(root, v1);
        return v1;
    }
};

(2)只出现一次的数字Ⅰ

class Solution
{
public:
    int singleNumber(vector<int>& nums)
    {
        size_t val = 0;
        for (auto e : nums)
        {
            val ^= e;
        }
        return val;
    }
};

(3)杨辉三角

在这里插入图片描述

class Solution
{
public:
    vector<vector<int>> generate(int numRows)
    {
        vector<vector<int>> vv;
        vv.resize(numRows);

        for (size_t i = 0; i < vv.size(); i++)
        {
            vv[i].resize(i + 1);
            vv[i][0] = vv[i][vv[i].size() - 1] = 1;
        }

        for (size_t i = 0; i < numRows; i++)
        {
            for (size_t j = 0; j < vv[i].size(); j++)
            {
                if (vv[i][j] != 1)
                {
                    vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
                }
            }
        }
        return vv;
    }
};

(4)电话号码的字母组合

在这里插入图片描述

class Solution
{
    const char* numStrArr[10] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
public:
    void combine(string& digits, int i, string combine_str, vector<string>& ret)
    {
        if (i == digits.size())
        {
            ret.push_back(combine_str);
            return;
        }

        int num = digits[i] - '0'; //每次从digits取一个字符转成数字
        string str = numStrArr[num]; //记录该数字对应的字符串

        /*for (int j = 0; j < str.size(); j++)
        {
            combine(digits, i + 1, combine_str + str[j], ret);
        }*/

        for (auto ch : str)
        {
            combine(digits, i + 1, combine_str + ch, ret);
        }
    }

    vector<string> letterCombinations(string digits)
    {
        vector<string> v; //用来存放所有组合结果

        if (digits.empty())
        {
            return v;
        }

        string str; //创建一个空字符串用来存每次的组合结果

        combine(digits, 0, str, v);

        return v;
    }
};

(5)删除有序数组中的重复项

class Solution
{
public:
    //方法1:双指针+vector的使用
    /*int removeDuplicates(vector<int>& nums)
    {
        int slow = 0;
        int fast = 1;
        while (fast < nums.size())
        {
            if (nums[slow] == nums[fast])
            {
                nums.erase(nums.begin() + fast);
            }
            else
            {
                fast++;
                slow++;
            }
        }
        return nums.size(); //返回元素个数
    }*/

    //方法2:双指针
    int removeDuplicates(vector<int>& nums)
    {
        int slow = 0;
        int fast = 1;
        while (fast < nums.size())
        {
            if (nums[fast] == nums[slow])
            {
                fast++;
            }
            else
            {
                slow++;
                nums[slow] = nums[fast];
                fast++;
            }
        }
        return slow + 1; //返回元素个数=下标+1
    }
};

(6)只出现一次的数字Ⅱ

在这里插入图片描述

class Solution
{
public:
    void Swap(int* a, int* b)
    {
        int tmp = *a;
        *a = *b;
        *b = tmp;
    }

    int Partsort(int* a, int left, int right)
    {
        int keyi = left;
        while (left < right)
        {
            //右边先开始
            while (left < right && a[right] >= a[keyi])
            {
                right--;
            }
            //右边找到再找左边
            while (left < right && a[left] <= a[keyi])
            {
                left++;
            }
            Swap(&a[left], &a[right]);
        }
        Swap(&a[left], &a[keyi]);
        return left;
    }

    void nums_Sort(int* a, int begin, int end)
    {
        if (begin >= end)
        {
            return;
        }

        int keyi = Partsort(a, begin, end);
        nums_Sort(a, begin, keyi - 1);
        nums_Sort(a, keyi + 1, end);
    }

    //方法1:【先排序,再3个3个遍历数组】
    int singleNumber(vector<int>& nums)
    {
        //快排
        nums_Sort(&nums[0], 0, nums.size() - 1);

        int result;
        for (int i = 0; i < nums.size(); i += 3)
        {
            //判出界
            if (i + 1 >= nums.size())
            {
                result = nums[i];
                break;
            }

            if (nums[i] != nums[i + 2])
            {
                result = nums[i];
                break;
            }
        }
        return result;
    }

    //方法2:【按位计算】
    /*int singleNumber(vector<int>& nums)
    {
        int result = 0;
        for (int i = 0; i < 32; i++)
        {
            int sum = 0;
            for (int num : nums)
            {
                sum += ((num >> i) & 1);
            }
            if (sum % 3)
            {
                result |= (1 << i); //【|=按位或】
            }
        }
        return result;
    }*/
};

(7)只出现一次的数字Ⅲ

博客:👉【C/C++】x & -x 的含义
防止溢出:

  • INT_MAX = 2^31-1 = 2147483647
  • INT_MIN = -2^31 = -2147483648

在这里插入图片描述

class Solution
{
public:
    vector<int> singleNumber(vector<int>& nums)
    {
        //算出所有数异或后的和
        int xorsum = 0;
        for (auto e : nums)
        {
            xorsum ^= e;
        }

        //防止溢出
        //测试用例:[1,1,0,-2147483648],如果对-2147483648取负,那就溢出了
        int lsb = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum)); //取出xorsum的二进制表示中最低位那个1

        //按L位的不同分成两个组
        int type1 = 0, type2 = 0;

        for (auto f : nums)
        {
            if (f & lsb)
            {
                type1 ^= f; //二进制表示的第L位为1的数
            }
            else
            {
                type2 ^= f; //进制表示的第L位为0的数
            }
        }

        return { type1,type2 };
    }
};

(8)数组中出现次数超过一半的数字

class Solution
{
public:
    int MoreThanHalfNum_Solution(vector<int>& numbers)
    {
        sort(numbers.begin(),numbers.end()); //排序数组
        return numbers[numbers.size()/2]; //取中间元素
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Visual Studio 2022实现透明按钮和标签、POPUP样式窗体的一种工业系统的UI例程

例程实现的功能说明 1、主窗体采用POPUP样式&#xff0c;无标题栏、无菜单栏&#xff0c;适合工业类软件 2、按钮、标签使用自绘&#xff0c;实现透明样式&#xff0c;可以实现灵活的样式设计&#xff0c;更具设计感 按钮重绘函数&#xff1a;OnDrawItem()按钮样式设定&#…

便携式水质检测仪都测哪些水中指标

水质检测仪分为实验室&#xff08;台式&#xff09;和户外使用的便携式多参数水质检测仪。 便携式的有哪些特点&#xff1f; 相对于实验室的水质分析设备&#xff0c;便携式水质多参数分析仪体积小巧&#xff0c;结构简单&#xff0c;户外使用更加便捷&#xff0c;功能更丰富。…

YOLO V5 和 YOLO V8 对比学习

参考文章&#xff1a; 1、YOLOv5 深度剖析 2、如何看待YOLOv8&#xff0c;YOLOv5作者开源新作&#xff0c;它来了&#xff01;? 3、anchor的简单理解 完整网络结构 YOLO v5和YOLO v8的Head部分 YOLO v8的Head 部分相比 YOLOv5 改动较大&#xff0c;换成了目前主流的解耦头结构…

Nexus私有仓库+IDEA配置远程推送

目录 一、docker安装nexus本地私服&#xff0c;Idea通过maven配置deploy本地jar包&#xff08;简单&#xff09; 二、docker push镜像到第三方nexus远程私服&#xff08;shell命令操作&#xff09; 三、springboot通过maven插件自动生成docker镜像并push到nexus私服&#xf…

(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

目录 1、备忘录模式&#xff08;Memento Pattern&#xff09;含义 2、备忘录模式的UML图学习 3、备忘录模式的应用场景 4、备忘录模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现备忘录模式的实例 1、备忘录模式&#…

7.react useReducer使用与常见问题

useReducer函数 1. useState的替代方案.接收一个(state, action)>newState的reducer, 并返回当前的state以及与其配套的dispatch方法2. 在某些场景下,useReducer会比useState更加适用,例如state逻辑较为复杂, 且**包含多个子值**,或者下一个state依赖于之前的state等清楚us…

部署你自己的导航站-dashy

现在每天要访问的网页都太多了&#xff0c;尽管chrome非常好用&#xff0c;有强大的标签系统。但是总觉的少了点什么。 今天我就来分享一个开源的导航网站系统 dashy。这是一个国外的大佬的开源项目 github地址如下&#xff1a;https://github.com/Lissy93/dashy 来简单说一下…

git操作:将一个仓库的分支提交到另外一个仓库分支

这个操作&#xff0c;一般是同步不同网站的同个仓库&#xff0c;比如说gitee 和github。某个网站更新了&#xff0c;你想同步他的分支过来。然后基于分支开发或者其它。 操作步骤 1.本地先clone 你自己的仓库。也就是要push 分支的仓库。比如A仓库&#xff0c;把B仓库分支&am…

函数(个人学习笔记黑马学习)

1、函数定义 #include <iostream> using namespace std;int add(int num1, int num2) {int sum num1 num2;return sum; }int main() {system("pause");return 0; } 2、函数的调用 #include <iostream> using namespace std;int add(int num1, int num2…

2023-8-31 Dijkstra求最短路(二)

题目链接&#xff1a;Dijkstra求最短路 II #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue>using namespace std;typedef pair<int, int> PII;const int N 150010;int n, m; int h[N…

网络中的问题2

距离-向量算法的具体实现 每个routerY的路由表表项 involve<目的网络N&#xff0c;距离d&#xff0c;下一跳X> 对邻居X发来的报文,先把下一跳改为X,再把距离1,if original route table doesn’t involve N,add this item&#xff1b; else if original table’s relate…

Mysql 索引

索引 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09; 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该行数据对应…

mongodb 分片集群部署

文章目录 mongodb 分片部署二进制安装三台config 配置shard 分片安装shard1 安装shard2 安装shard3 安装mongos 安装数据库、集合启用分片创建集群认证文件创建集群用户部署常见问题 mongodb 分片部署 二进制安装 mkdir -p /data/mongodb tar xvf mongodb-linux-x86_64-rhel7…

Python编程——深入了解不可变的元组

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、元组是什么 二、元组的定义 1、相同类型组成元组…

[C++]构造与毁灭:深入探讨C++中四种构造函数与析构函数

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

05架构管理之持续集成-DevOps的理解与实现

专栏说明&#xff1a;针对于企业的架构管理岗位&#xff0c;分享架构管理岗位的职责&#xff0c;工作内容&#xff0c;指导架构师如何完成架构管理工作&#xff0c;完成架构师到架构管理者的转变。计划以10篇博客阐述清楚架构管理工作&#xff0c;专栏名称&#xff1a;架构管理…

分享一个vue-slot插槽使用场景

需求再现 <el-table-column align"center" label"状态" prop"mitStatus" show-overflow-tooltip />在这里&#xff0c;我想对于状态进行一个三目判断&#xff0c;如果为0那就是进行中&#xff0c;否则就是已完成&#xff0c;期初我是这样写…

项目-IM

zk 启动类实现CommandLineRunner接口&#xff0c;重写run()方法 单聊 群聊 离线消息

Android OTA 相关工具(六) 使用 lpmake 打包生成 super.img

我在 《Android 动态分区详解(二) 核心模块和相关工具介绍》 介绍过 lpmake 工具&#xff0c;这款工具用于将多个分区镜像打包生成一个 Android 专用的动态分区镜像&#xff0c;一般称为 super.img。Android 编译时&#xff0c;系统会自动调用 lpmake 并传入相关参数来生成 sup…

uniapp实现:点击拨打电话,弹出电话号码列表,可以选择其中一个进行拨打

一、实现效果&#xff1a; 二、代码实现&#xff1a; 在uni-app中&#xff0c;使用uni.showActionSheet方法实现点击拨打电话的功能&#xff0c;并弹出相关的电话列表供用户选择。 当用户选择了其中一个电话后&#xff0c;会触发success回调函数&#xff0c;并通过res.tapInde…