[C++]:10.vector使用

vector使用

  • 一.vector使用
    • 1.构造函数:
    • 2.迭代器+遍历数据:
    • 3.空间问题:
      • 1.size():返回有效数据个数:
      • 2.capacity():返回容量大小:
      • 3.容量检测:
      • 4.emptr():判断顺序表是否为空:
      • 5.resize():改变vector的size
      • 6.reserve():改变vector的capacity
      • 7.shrink_to_fit(): 减少当前容量到size的大小:
    • 4.增删查改:
      • 1.operator[] 和 at:
      • 2.push_back() 和 pop_back()
      • 3.find()
      • 4.insert 和 erase
      • 5.swap()
    • 5.赋值函数 和 拷贝构造函数:
  • 二.练习题:
    • 1.只出现一次的数字_1
    • 1-1:GIF 题目解析
    • 2.只出现一次的数字_2
    • 2-1:GIF 题目解析
    • 3.只出现一次的数字_3
    • 3-1:GIF 题目解析
    • 4.杨辉三角
    • 4-1:GIF 题目解析
    • 5.删除有序数组中的重复项
    • 5-1:GIF 题目解析
    • 6.数字中出现次数超过一半的数字
    • 6-1:GIF 题目解析
    • 7.电话号码的字母组合
    • 方法一:循环方法:
    • 方法二:dfs方法:
    • 7-1:GIF 题目解析

一.vector使用

1.构造函数:

void text_1()
{//0.类型的重定义://typedef T value_type//typedef value_type* iterator//1.无参:vector<>()vector<int> v_1;//2.构造并且初始化n个val://vector<> (size_type n, const value_type& val = value_type())vector<int> v_2(10, 2);//3.拷贝构造:vector<> (const vector& x);vector<int> v_3(v_2);//4.迭代器进行初始化构造:vector<> (InputIterator first, InputIterator last);vector<int> v_4(v_2.begin(), v_2.end());
}

补充:
1.迭代器可以是其他任意类型在这个地方发生的是隐式类型的转换:
2.使用迭代器进行初始化构造的时候一定是一个已经实例化好的对象的迭代器。
3.注意数值的类型:

在这里插入图片描述

2.迭代器+遍历数据:

//2.迭代器+数据遍历
void text_2()
{//1.列表初始化:vector<int> v1 = { 1,2,3,4,5,6,7 };//2.迭代器遍历:vector<int>::iterator it_1 = v1.begin();while (it_1 != v1.end()){cout << *it_1 << " ";it_1++;}cout << endl;
}

在这里插入图片描述

补充迭代器的空间结构:

在这里插入图片描述

3.空间问题:

1.size():返回有效数据个数:

void text_3()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9,10 };//1.有效数据的个数:cout << "efective data:" << v1.size() << endl;
}

在这里插入图片描述

2.capacity():返回容量大小:

void text_3()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9,10 };//2.容量的大小:cout << "capacity : " << v1.capacity() << endl;
}

在这里插入图片描述

3.容量检测:

void text_3()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9,10 };int cat = 100;int flag = 0;while (cat--){v1.push_back(cat);flag++;if (flag == 10){cout << "efective data:" << v1.size();cout << "capacity : " << v1.capacity() << endl;flag = 0;}}
}

在这里插入图片描述

1.在vs下容量的扩容是1.5倍的进行扩容。
2.在SGI下是2倍进行扩容操作。

4.emptr():判断顺序表是否为空:

void text_3()
{//4.判断vector是否为空:vector<int> v1 = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v2;if (v2.empty()){cout << "v2 is empty!" << endl;}else{cout << "v2 not empty!" << endl;}if (v1.empty()){cout << "v1 is empty!" << endl;}else{cout << "v1 not empty!" << endl;}
}

在这里插入图片描述

5.resize():改变vector的size

//void resize (size_type n, value_type val = value_type());
//我们通过上面的代码发现resize改变size的大小同时是会去初始化这些空间的!

void text_3()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v2 = { 1,2,3,4,5,6,7,8,9,10 };//5.改变当前的sizev1.resize(20, 2);vector<int>::iterator it_1 = v1.begin();cout << "resize dilatation!";while (it_1 != v1.end()){cout << *it_1 << " ";it_1++;}cout << endl;v1.resize(5, 2);vector<int>::iterator it_2 = v1.begin();cout << "resize reduction!";while (it_2 != v1.end()){cout << *it_2 << " ";it_2++;}cout << endl;
}

在这里插入图片描述

6.reserve():改变vector的capacity

//void reserve (size_type n);
//我们通过上面的代码发现reserve适用于知道需要多少空间的情况并且这些空间不需要当前就去初始化

void text_3()
{//6.改变当前的capacityvector<int> v1;v1.reserve(100);int flag = 0;for (int i = 0; i < 100; i++){v1.push_back(i);flag++;if (flag == 10){cout << "new capacity:" << v1.capacity() << endl;flag = 0;}}
}

在这里插入图片描述

7.shrink_to_fit(): 减少当前容量到size的大小:

shrink_to_fit() C++ 11 新增内容
我们当前的capacity比较大当前情况以后都不会扩容不需要额外的空间了在这个情况下可以使用shrink_to_fit()进行减少容量到当前的size!

void text_3()
{//7.减少当前容量到size:vector<int> v1;v1.reserve(100);int flag = 0;for (int i = 0; i < 50; i++){v1.push_back(i);flag++;if (flag == 10){cout << "new capacity:" << v1.capacity() << endl;flag = 0;}}//容量开多了!v1.shrink_to_fit();cout << "new size:" << v1.capacity() << endl;cout << "new capacity:" << v1.capacity() << endl;
}

在这里插入图片描述

4.增删查改:

1.operator[] 和 at:

在这里插入图片描述
在这里插入图片描述

1.使用和string中的[] 和at的使用是相同的!
2.operator[] 是断言检查直接报错
3.at 是 抛异常的进行检查!比较温柔!

2.push_back() 和 pop_back()

在这里插入图片描述

在这里插入图片描述

void text_4()
{//1.push_back()  pop_back()vector<string> v1_str;int cat_1 = 10;while (cat_1--){string s1("hello");v1_str.push_back(s1);}int cat_2 = 5;while (cat_2--){v1_str.pop_back();}}

在这里插入图片描述

3.find()

在这里插入图片描述

1.find在一个迭代器范围内寻找想要找到的值并且返回迭代器。

void text_4()
{//2.find()//template <class InputIterator, class T>//InputIterator find(InputIterator first, InputIterator last, const T & val);vector<int> v1 = { 1,2,3,4,5,6,7,8,9,10 };vector<int>::iterator it_1 = find(v1.begin(),v1.end(), 3);cout << "find num is :" << *it_1 << endl;
}

在这里插入图片描述

4.insert 和 erase

在这里插入图片描述
在这里插入图片描述

1.insert和erase 通常是和find()在一起使用:
2.insert 在postion位置之前插入一个数据因为插入数据需要把后面的数据向会移动。
3.erase是删除postion位置的数据并且后面的数据需要向前面覆盖。
4.注意:每次插入或者删除数据迭代器的值会更新!

在这里插入图片描述

void text_4()
{//3.insert 和 erase vector<int> v1 = { 1,2,3,5,6,6,8,9,10,10};vector<int>::iterator f_1 = find(v1.begin(), v1.end(), 5);v1.insert(f_1, 4);vector<int>::iterator f_2 = find(v1.begin(), v1.end(), 8);v1.insert(f_2, 7);//2.迭代器遍历:vector<int>::iterator it_1 = v1.begin();while (it_1 != v1.end()){cout << *it_1 << " ";it_1++;}cout << endl;vector<int>::iterator f_3 = find(v1.begin(), v1.end(), 6);v1.erase(f_3);vector<int>::iterator f_4 = find(v1.begin(), v1.end(), 10);v1.erase(f_4);vector<int>::iterator it_2 = v1.begin();while (it_2 != v1.end()){cout << *it_2 << " ";it_2++;}cout << endl;}

5.swap()

在这里插入图片描述

void text_4()
{//4.swap的使用://template <class T, class Alloc>//void swap(vector<T, Alloc>&x, vector<T, Alloc>&y);vector<int> v1 = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v2 = { 11,12,13,14,15,16,17,18,19,20 };swap(v1, v2);vector<int>::iterator it_1 = v1.begin();while (it_1 != v1.end()){cout << *it_1 << " ";it_1++;}cout << endl;vector<int>::iterator it_2 = v2.begin();while (it_2 != v2.end()){cout << *it_2 << " ";it_2++;}cout << endl;
}

在这里插入图片描述

5.赋值函数 和 拷贝构造函数:

在这里插入图片描述

1.给一个对象初始化赋值其实是拷贝构造:
2.给两个已经初始化好的数据进行赋值才是赋值

	//5.赋值函数:vector<int> v1 = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v2 = { 11,12,13,14,15,16,17,18,19,20 };v1 = v2;vector<int>::iterator it_1 = v1.begin();while (it_1 != v1.end()){cout << *it_1 << " ";it_1++;}cout << endl;vector<int>::iterator it_2 = v2.begin();while (it_2 != v2.end()){cout << *it_2 << " ";it_2++;}cout << endl;

在这里插入图片描述

二.练习题:

1.只出现一次的数字_1

在这里插入图片描述

只出现一次的数字_1

1-1:GIF 题目解析

思路一:1.使用异或思路把所有数据遍历异或一边。

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

2.只出现一次的数字_2

在这里插入图片描述

只出现一次的数字_2

思路一:排序+三指针遍历
1.因为排完序,不同的那个数始终出现在第一个指针位置:
2.特殊情况有两个:
2-1:只有一个数子直接返回
2-2:排序之后单个数字在最后中间指针和末尾下标的越界问题要考虑到!

2-1:GIF 题目解析

class Solution {
public:int singleNumber(vector<int>& nums) {if(nums.size()==1)return nums[0];//1.排序sort(nums.begin(),nums.end());//2.三指针遍历数据:int l = 0;int m = 1;int r = 2;while(l < nums.size()){if( m >= nums.size() && r >= nums.size()){return nums[l];}if(nums[m] == nums[r] && nums[m] != nums[l]){return nums[l];}else {l+=3;m+=3;r+=3;}}return 0;}
};

3.只出现一次的数字_3

在这里插入图片描述

只出现一次的数字_3

在这里插入图片描述

3-1:GIF 题目解析

在这里插入图片描述

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {//0.特殊情况:int n = nums.size();if(n==2)return nums;//1.排序sort(nums.begin(),nums.end());//2.创建双指针分析各种情况解决方案:int left = 0;int right = 1;vector<int> vv ;while(left<n && right<=n){//情况1: 1 1 2 3 3 4 4 5if(right == n){vv.push_back(nums[left]);break;}if(nums[left]==nums[right]){left+=2;right+=2;}else{vv.push_back(nums[left]);left+=1;right+=1;}}return vv;}
};

4.杨辉三角

在这里插入图片描述

杨辉三角

在这里插入图片描述

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vv(numRows);for (size_t i = 0; i < numRows; i++){vv[i].reserve(i + 1);vv[i].resize(i + 1, 0);vv[i][0] = 1;vv[i][i] = 1;}for (size_t i = 0; i < vv.size(); i++){for (size_t j = 0; j < vv[i].size(); j++){if (vv[i][j] == 0){vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];}}}return vv;}
};

4-1:GIF 题目解析

在这里插入图片描述

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

在这里插入图片描述
删除有序数组中的重复项

思路一:
1.记住两个指针进行遍历数据:
2.同时进行判断:
2-1:数据相同:删除后面的那个it_2 更新:
2-1:数据不同:it_1++ it_2++

5-1:GIF 题目解析

在这里插入图片描述

class Solution {
public:int removeDuplicates(vector<int>& nums) {vector<int>::iterator it_1 = nums.begin();vector<int>::iterator it_2 = nums.begin() + 1;int count = 0;while (it_2 != nums.end()){if (*it_1 == *it_2){nums.erase(it_2);it_2 = it_1 + 1;//更新因为删除数据导致的迭代器的变化}else if (*it_1 != *it_2){it_1++;it_2++;}}return nums.size();}
};

6.数字中出现次数超过一半的数字

在这里插入图片描述

数字中出现次数超过一半的数字

思路一:
在这里插入图片描述

6-1:GIF 题目解析

在这里插入图片描述

#include <iostream>
class Solution {
public:int MoreThanHalfNum_Solution(vector<int>& numbers){// write code hereif (numbers.size() == 1){return numbers[0];}//1.遍历寻找众数:vector<int>::iterator it_1 = numbers.begin();int cnt = 0;int count = -1;while (it_1 != numbers.end()){if (cnt == 0){count = *it_1;cnt++;}else if (cnt > 0){if (count == *it_1){cnt++;}else{cnt--;}}it_1++;}cout << cnt << ":" << count << endl;//2.确定是不是重数:cnt = 0;for (const int num : numbers){if (num == count){cnt++;}}if (cnt > (numbers.size() / 2)){return count;}return 0;}};

7.电话号码的字母组合

在这里插入图片描述

电话号码的字母组合

方法一:循环方法:

1.一个vector< string > 类型的顺序表保存数据通过下标对应字符串
2.因为输入的数字字符串是有长度限制的所以暴力的方法就是。
3.从输入数字字符串长度为2到4进行多次的循环遍历数据。
4.在for的最深处进行const char* 的定义通过string进行转化:
5.在for外面先转化为const char* 类型方便循环的遍历数据!

class Solution {
public:vector<string> letterCombinations(string digits) {vector<string> tem;tem.push_back("");tem.push_back("");tem.push_back("abc");tem.push_back("def");tem.push_back("ghi");tem.push_back("jkl");tem.push_back("mno");tem.push_back("pqrs");tem.push_back("tuv");tem.push_back("wxyz");int size_d = (int)digits.size();const char* num = digits.c_str();vector<string> buffer;if (size_d == 0){return buffer;}if (size_d == 1){int pos = num[0] - 48;int size = (int)tem[pos].size();const char* arr = tem[pos].c_str();for (int i = 0; i < size; i++){char ch = arr[i];string tmp(1,ch);buffer.push_back(tmp);}}else if (size_d > 1){if (size_d == 2){int pos_1 = num[0] - 48;int pos_2 = num[1] - 48;int size_1 = (int)tem[pos_1].size();int size_2 = (int)tem[pos_2].size();const char* arr_1 = tem[pos_1].c_str();const char* arr_2 = tem[pos_2].c_str();for (int i = 0; i < size_1; i++){for (int j = 0; j < size_2; j++){const char arr[3] = { arr_1[i],arr_2[j],'\0' };string s1(arr);buffer.push_back(s1);}}}if (size_d == 3){int pos_1 = num[0] - 48;int pos_2 = num[1] - 48;int pos_3 = num[2] - 48;int size_1 = (int)tem[pos_1].size();int size_2 = (int)tem[pos_2].size();int size_3 = (int)tem[pos_3].size();const char* arr_1 = tem[pos_1].c_str();const char* arr_2 = tem[pos_2].c_str();const char* arr_3 = tem[pos_3].c_str();for (int i = 0; i < size_1; i++){for (int j = 0; j < size_2; j++){for (int x = 0; x < size_3; x++){const char arr[4] = { arr_1[i],arr_2[j],arr_3[x],'\0' };string s1(arr);buffer.push_back(s1);}}}}if (size_d == 4){int pos_1 = num[0] - 48;int pos_2 = num[1] - 48;int pos_3 = num[2] - 48;int pos_4 = num[3] - 48;int size_1 = (int)tem[pos_1].size();int size_2 = (int)tem[pos_2].size();int size_3 = (int)tem[pos_3].size();int size_4 = (int)tem[pos_4].size();const char* arr_1 = tem[pos_1].c_str();const char* arr_2 = tem[pos_2].c_str();const char* arr_3 = tem[pos_3].c_str();const char* arr_4 = tem[pos_4].c_str();for (int i = 0; i < size_1; i++){for (int j = 0; j < size_2; j++){for (int x = 0; x < size_3; x++){for (int y = 0; y < size_4; y++){const char arr[5] = { arr_1[i],arr_2[j],arr_3[x],arr_4[y],'\0' };string s1(arr);buffer.push_back(s1);}}}}}}return buffer;}
};

方法二:dfs方法:

在这里插入图片描述

class Solution {
public:vector<string> tem = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};void combine(string& num, size_t di , string  com_str , vector<string>& vv){if(di==num.size()){vv.push_back(com_str);return;}int pos = num[di] - '0';int len = tem[pos].size();string s1 = tem[pos];for(int i=0;i<len;i++){combine(num,di+1,com_str+s1[i],vv);}}vector<string> letterCombinations(string digits) {vector<string> vv;   if(digits.size()==0)return vv;combine(digits,0,"",vv);return vv;}
};

7-1:GIF 题目解析

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux6-配置网络、源码包的编译和安装

配置 linux 网络 配置主机名 修改/etc/hostname 配置文件&#xff0c;永久配置主机名 [rootlocalhost ~]# vim /etc/hostname svr7.tedu.cn [rootlocalhost ~]# cat /etc/hostname svr7.tedu.cn [rootlocalhost ~]# reboot #重启生效命令行永久修改主机名 [rootlocalhost ~…

Vue3使用Tailwind CSS

安装 Tailwind 以及其它依赖项 npm install -D tailwindcsslatest postcsslatest autoprefixerlatest生成配置文件&#xff1a; npx tailwindcss init -p.修改配置文件 tailwind.config.js 2.6版本 &#xff1a; module.exports {purge: [./index.html, ./src/**/*.{vue,j…

arm-none-eabi-gcc not find

解决办法&#xff1a;安装&#xff1a;gcc-arm-none-eabi sudo apt install gcc-arm-none-eabi; 如果上边解决问题了就不用管了&#xff0c;如果解决不了&#xff0c;加上下面这句试试运气&#xff1a; $ sudo apt-get install lsb-core看吧方正我是运气还不错&#xff0c;感…

call,apply,bind

1.这三个方法都能改变this的指向 2.代码实战 let obj1 {name: "小红",age: 20,fn: function () {console.log(当前this的指向,this);console.log(我叫${this.name},今年${this.age}岁);},};obj1.fn(); 这里的代码,obj1是一个对象,里面有属性name和age 正常情况下我…

计数排序详解

前言&#xff1a;这篇文章会给大家把计数排序安排的明明白白&#xff0c;详细的讲解计数排序的原理 例子&#xff1a;现在我有一个数组不知道里面到底有多少个元素&#xff0c;但是我要把它进行排序&#xff0c;怎么排序呢&#xff1f; 我先随便拿一个数组&#xff08;你假装你…

Java JMM

JMM 全称: Java Memory Model (Java 内存模式)。 它是一种虚拟机规范, 用于屏蔽掉各种硬件和操作系统的内存访问差异, 以实现 Java 程序在各种平台下都能达到一致的并发效果。 主要规定了以下两点 一个线程如何以及何时可以看到其他线程修改过后的共享变量的值, 即线程之间共享…

I.MX6ULL_Linux_驱动篇(46)linux LCD驱动

LCD 是很常用的一个外设&#xff0c;在Linux 下LCD 的使用更加广泛&#xff0c;在搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们就来学习一下如何在 Linux 下驱动 LCD 屏幕。 Linux 下 LCD 驱动简析 Framebuffer 设备 先来回顾一下裸机的时候 LCD 驱动是怎…

一次 k8s 升级,竟然导致滴滴故障 12 小时?

大家好&#xff0c;我是君哥。 前段时间滴滴的故障相信大家都知道了。中断业务 12 小时定级为 P0 级故障一点都不冤。 故障回顾 网上有传言是运维人员升级 k8s 时&#xff0c;本来计划是从 1.12 版本升级到 1.20&#xff0c;但是操作失误选错了版本&#xff0c;操作了集群降级…

2-5、包含多个段的程序

语雀原文链接 文章目录 1、概述2、代码段中使用数据示例1&#xff1a;不指定程序入口示例2&#xff1a;指定程序入口原理梳理 3、在代码段中使用栈例子1例子2 4、数据、代码、栈放入不同的段例子1&#xff1a;end start指定程序入口第一步&#xff1a;设置栈顶第二步&#xff…

Lambda表达式规则,用法

Lambda表达式是JDK8新增的一种语法格式 1.作用 简化匿名内部类的代码写法 Lambad用法前提&#xff1a;只能简化函数式接口&#xff08;一般加有Funcationallnterface&#xff09;&#xff08;有且仅有一个抽象方法&#xff09;的匿名内部类 匿名内部类&#xff1a;(本质是对…

Linux系统编程:进程间通信总结

管道 在Linux中&#xff0c;管道是一种进程间通信方式&#xff0c;它允许一个进程&#xff08;写入端&#xff09;将其输出直接连接到另一个进程&#xff08;读取端&#xff09;的输入。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同。 具体…

Dockerfile 指令的最佳实践

这些建议旨在帮助您创建一个高效且可维护的Dockerfile。 一、FROM 尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像&#xff0c;因为它受到严格控制&#xff0c;体积小&#xff08;目前不到6 MB&#xff09;&#xff0c;同时仍然是一个完整的Linux发行版。 FR…