【c++】vector的增删查改

1.先定义一个类对象vector

为了防止和库里面发生冲突,定义一个命名空间,将类对象放在命名空间 里面

#include<iostream>
using namespace std;
namespace zjw {
 class vector {

 public:
 private:


    };
}

2.定义变量,需要一个迭代器,为了便于修改,变成任意类型的迭代器,我们使用函数模版,三个迭代器变量 _start用于指向顺序表的头,_finish指向顺序表的结尾的下一位,_end_of_storage保存总容量,在初始化列表中先设置为空

#include<iostream>
using namespace std;
namespace zjw {
    template<class T>
 class vector {
 
 public:
     typedef T * iterator;//迭代器类型
     vector()
         :_start(nullptr)
         , _finish(nullptr)
         , _end_of_storage(nullptr)
     {
     }

    private:
         iterator _start;
         iterator _finish;
         iterator _end_of_storage


    };
}

3.定义函数

1.返回指向顺序表开始的迭代器函数
2.返回指向顺序表结尾的迭代器函数
3.返回容量大小的函数
4.返回顺序表元素多少
5.判断顺序表为空地的函数
5.一个运算符重载的函数(返回给定下标下的值)

#include<iostream>
using namespace std;
namespace zjw {
    template<class T>
 class vector {
 
 public:
     typedef T * iterator;//迭代器类型
     vector()
         :_start(nullptr)
         , _finish(nullptr)
         , _end_of_storage(nullptr)
     {
     }
     iterator begin()//1
     {
         return _start;
     }
     iterator end()//2
     {
         return  _finish;
     }
     size_t capacity()//3
     {
         return _end_of_storage - _start;
     
     }
     size_t size()//4
     {
         return _finish - _start;
     
     
     }
     bool empty()//5
     {
         return _finish == _start;
     
     
     }
     T& operator[](size_t pos)//6
     {
         assert(pos < size());
         return _start[pos];
     
     
     }




    private:
         iterator _start;
         iterator _finish;
         iterator _end_of_storage;


    };
}

4.reserve函数开空间

  void reserve(size_t n)
     {
         if (n > capacity)
         {
             T* tmp = new T[n];
             if (_start)
             {
                 memcpy(tmp, _start, sizeof(T) * size());
                 delete[] _start;
             }
             _start = tmp;
             _finish = _start + size();
             _end_of_storage = _start + n;





         }
     
     
     
     
     
     
     }

5.push_back函数尾插,以及尾删函数

 void push_back(const T& x)
     {
         if (_finish == _end_of_storage)
         {

             reserve(capacity() == 0 ? 4 : capacity() * 2);





         }
         *_finish = x;
         _finish++;
     }
     void pop_back()
     {
     
         assert(!empty());
         --_finish;
     
     
     
     }

6.测试尾插,尾删,下标遍历,迭代器遍历,范围for遍历,以及运算符重载返回对应下标的元素

 void test1()
 {
     vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     v1.push_back(5);
     for (int i = 0; i < v1.size(); i++)
     {
         cout << v1[i] << " ";
     }
     cout << endl;
     v1.pop_back();
     v1.pop_back();
     vector<int>::iterator it = v1.begin();
     while (it != v1.end())
     {
         cout << *it << " ";
         ++it;

     }
     cout << endl;
     v1.pop_back();
     for (auto e : v1)
     {
         cout << e << " ";


     }
     cout << endl;
 
 
 
 
 
 
 }

这里开空间的函数会发生问题
在这里插入图片描述

7.修改扩容函数

  void reserve(size_t n)
     {
         if (n > capacity)
         {   int sz=size();
             T* tmp = new T[n];
             if (_start)
             {
                 memcpy(tmp, _start, sizeof(T) * size());
                 delete[] _start;
             }
             _start = tmp;
             _finish = _start + sz;
             _end_of_storage = _start + n;





         }
     
     
     
     
     
     
     }

在这里插入图片描述

8.resize函数

参数小于容量大小,相当于缩容,参数大于容量大小,相当于扩容,超过_finish的用值初始化
在讲resize之前看看模版会不会给匿名变量初始化,内置类型是否能初始化.

 template <class T>
 void f()
 {
     T x = T();
     cout << x << endl;



 }
 void test3()
 {

     f<int>();
     f<int*>();
     f<double>();




 }

在这里插入图片描述
发现可以,所以我们在resize里面当n>capacity(),我们可以把顺序表外的用来初始化,自定义类型相当于调用自己的构造函数,内置函数我们在这假装理解为调用自己的构造函数.

  void resize(size_t n, T val = T())
     {
         if (n < size())
         {
             _finish = _start + n;
         }
         else
         {
             if (n > capacity())
                 reserve(n);
             while (_finish != _start + n)
             {
                 *_finish = val;
                 ++_finish;

             }





         }




     }

9.测试resize

 void test2()
 {
     vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     v1.push_back(5);
     cout << v1.size() << endl;
     cout << v1.capacity() << endl;
     v1.resize(10);
     cout << v1.size() << endl;
     cout << v1.capacity() << endl;
     for (auto e : v1)
     {
         cout << e << " ";


     }
     cout << endl;
     v1.resize(3);
     for (auto e : v1)
     {
         cout << e << " ";


     }

 
 
 
 
 }


}

在这里插入图片描述

10.封装一个打印函数用于任何vector对象

 void func(const vector<int>& v)
 {
     for (int i = 0; i < v.size(); i++)//下标
     {
         cout << v[i] << " ";



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

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


     }
     cout << endl;







 }

因为打印不同对象的元素,为了区分是有一个this指针的,但是参数是const 无法产生this指针
在这里插入图片描述
解决方法,在这些函数后面加 const ,如果是const对象调用的话,就是权限平移,如果是非const的话,是权限缩小,都可以调用了,如果要限制别人去修改这个*it,我们可以定义一个const的迭代器

void func(const vector<int>& v)
 {
     for (int i = 0; i < v.size(); i++)//下标
     {
         cout << v[i] << " ";



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

     }
     cout << endl;
     for (auto e : v)//范围for
     {
         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);
     v1.push_back(5);
     func(v1);
 
 
 }

11.insert函数实现

   void insert(iterator pos, const T& val)
     {
         assert(pos >= _start);
         assert(pos <= _finish);
         if (_finish == _end_of_storage)
         {
             reserve(capacity() == 0 ? 4 : capacity() * 2);




         }
         iterator end = _finish - 1;
         while (end >= pos)
         {
             *(end + 1) = *end;
             --end;


         }
         *pos = val;
         ++_finish;
     
     
     
     
     
     
     
     
     
     }

测试insert

 void test5()
 {
     vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     v1.push_back(5);
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     auto pos = find(v1.begin(), v1.end(), 3);//找到3的位置
     
     if (pos != v1.end())
     {
         v1.insert(pos, 30);//3前插入30



     }
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     (*pos)++;//让3+1

     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
 
 
 
 
 }


}

在这里插入图片描述
pos保存的之前是3的地址,如果在3前插入一个30,pos所指向的位置就变成了30,*pos++,就变成了31;

如果我们不使用push_back(5)的话

 void test5()
 {
     vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     //v1.push_back(5);
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     auto pos = find(v1.begin(), v1.end(), 3);//找到3的位置
     
     if (pos != v1.end())
     {
         v1.insert(pos, 30);//3前插入30



     }
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     (*pos)++;//让3+1

     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
 
 
 
 
 }


}

会出现报错,到底是怎么一回事??
在这里插入图片描述
在这里插入图片描述
如何修改??
我们需要在未扩容前记录好pos距离_start的位置,拷到新空间,他与新_start也保持这个距离,更新pos

   void insert(iterator pos, const T& val)
     {
         assert(pos >= _start);
         assert(pos <= _finish);
         if (_finish == _end_of_storage)
         {
             int len=pos - _start;
             reserve(capacity() == 0 ? 4 : capacity() * 2);
             pos = _start + len;



         }
         iterator end = _finish - 1;
         while (end >= pos)
         {
             *(end + 1) = *end;
             --end;


         }
         *pos = val;
         ++_finish;
     
   
     }

在这里插入图片描述
这里的*pos里面的数据被清理,如果不清理应该是3++,应该是4,我们可以注释掉reserve中的delete看看
在这里插入图片描述
这里的问题被叫做迭代器失效

12.earse函数

 void eraase(iterator pos)
     {
             assert(pos >= _start);
             assert(pos < _finish);
             iterator start = pos + 1;
             while (start != _finish)
             {
                 *(start - 1) = *start;
                 ++start;


             }
             --_finish;
     
     
     
     
     }

earse函数测试

void test6()
 {
     vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     auto pos = find(v1.begin(), v1.end(), 2);
     if (pos != v1.end())
     {
         v1.erase(pos);//删除2
     }
     (*pos)++;2位置上的元素++
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }






 }

在这里插入图片描述
这里2删除后2的地址上存的就是3,然后给3++;在std中这个也算迭代器失效,由于这里是自己写的,所以没报错.

 void test6()
 {
     std::vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     auto pos = find(v1.begin(), v1.end(), 2);
     if (pos != v1.end())
     {
         v1.erase(pos);
     }
     (*pos)++;
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }






 }


}

上面会调用vector里面的函数
在这里插入图片描述
在不同编译器下有不同的处理情况。在vs中std我们认为迭代器失效,如果删除的是4的话,以我们实现的earse后,–_finish ;4那里的值没有被清理,所以后面的(*pos)++也不会出错,但在vs中我们使用vector里面的实现认为迭代器失效.
我们可以将代码拷过去在linux下试一下g++是怎么回事??
在这里插入图片描述

在g++中使用库中的vector函数删除数据4没有报错,对于迭代器失效,不同编译器也有不同处理.

13.整体代码

#include<iostream>
#include<assert.h>
#include<vector>
using namespace std;
namespace zjw {
    template<class T>
 class vector {
 
 public:
     typedef T * iterator;//迭代器类型
     typedef T* const_iterator;//迭代器类型
     vector()
         :_start(nullptr)
         , _finish(nullptr)
         , _end_of_storage(nullptr)
     {
     }
     iterator begin()const 
     {
         return _start;
     }
     iterator end()  const
     {
         return  _finish;
     }
     size_t capacity()
     {
         return _end_of_storage - _start;
     
     }
     size_t size()  const
     {
         return _finish - _start;
     
     
     }
     bool empty()
     {
         return _finish == _start;
     
     
     }
      T& operator[](size_t pos)  const
     {
          assert(pos < size());
             return _start[pos];
     
     
     }
     void reserve(size_t n)
     {
        int sz = size();
         if (n > capacity())
         {
             T* tmp = new T[n];
             if (_start)
             {
                 memcpy(tmp, _start, sizeof(T) * size());
                 delete[] _start;
             }
             _start = tmp;
             _finish = _start + sz;
             _end_of_storage = _start + n;





         }
     
     
     
     
     
     
     }
     void push_back(const T& x)
     {
         if (_finish == _end_of_storage)
         {

             reserve(capacity() == 0 ? 4 : capacity() * 2);





         }
         *_finish = x;
         _finish++;
     }
     void pop_back()
     {
     
         assert(!empty());
         --_finish;
     
     
     
     }
     void resize(size_t n, T val = T())
     {
         if (n < size())
         {
             _finish = _start + n;
         }
         else
         {
             if (n > capacity())
                 reserve(n);
             while (_finish != _start + n)
             {
                 *_finish = val;
                 ++_finish;

             }





         }




     }
     void insert(iterator pos, const T& val)
     {
         assert(pos >= _start);
         assert(pos <= _finish);
         if (_finish == _end_of_storage)
         {
             int len=pos - _start;
             reserve(capacity() == 0 ? 4 : capacity() * 2);
             pos = _start + len;



         }
         iterator end = _finish - 1;
         while (end >= pos)
         {
             *(end + 1) = *end;
             --end;


         }
         *pos = val;
         ++_finish;
     
     
     
     
     
     
     
     
     
     }

     void erase(iterator pos)
     {
             assert(pos >= _start);
             assert(pos < _finish);
             iterator start = pos + 1;
             while (start != _finish)
             {
                 *(start - 1) = *start;
                 ++start;


             }
             --_finish;
     
     
     
     
     }











   




    private:
         iterator _start;
         iterator _finish;
         iterator _end_of_storage;


 
};
 void test1()
 {
     vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     v1.push_back(5);
     for (int i = 0; i < v1.size(); i++)
     {
         cout << v1[i] << " ";
     }
     cout << endl;
     v1.pop_back();
     v1.pop_back();
     vector<int>::const_iterator it = v1.begin();
     while (it != v1.end())
     {
         
         cout << *it << " ";
         
         ++it;

     }
     cout << endl;
     v1.pop_back();
     for (auto e : v1)
     {
         cout << e << " ";


     }
     cout << endl;
 
 
 
 
 
 
 }
 void test2()
 {
     vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     v1.push_back(5);
     cout << v1.size() << endl;
     cout << v1.capacity() << endl;
     v1.resize(10);
     cout << v1.size() << endl;
     cout << v1.capacity() << endl;
     for (auto e : v1)
     {
         cout << e << " ";


     }
     cout << endl;
     v1.resize(3);
     for (auto e : v1)
     {
         cout << e << " ";


     }

 
 
 
 
 }
 void func(const vector<int>& v)
 {
     for (int i = 0; i < v.size(); i++)//下标
     {
         cout << v[i] << " ";



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

     }
     cout << endl;
     for (auto e : v)//范围for
     {
         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);
     v1.push_back(5);
     func(v1);
 
 
 }
 void test5()
 {
     vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
    // v1.push_back(5);
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     auto pos = find(v1.begin(), v1.end(), 3);//找到3的位置
     
     if (pos != v1.end())
     {
         v1.insert(pos, 30);//3前插入30



     }
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     (*pos)++;//让3+1
     cout << *pos << endl;

     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
 
 
 
 
 }
 void test6()
 {
    std:: vector<int>v1;
     v1.push_back(1);
     v1.push_back(2);
     v1.push_back(3);
     v1.push_back(4);
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }
     cout << endl;
     auto pos = find(v1.begin(), v1.end(), 4);
     if (pos != v1.end())
     {
         v1.erase(pos);
     }
     (*pos)++;
     for (auto e : v1)//范围for
     {
         cout << e << " ";


     }






 }


}



int main()
{
   // zjw::test1();
      zjw::test6();
   // zjw::test3();
}

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

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

相关文章

【实战】二、Jest难点进阶(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(五)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶1.snapshot 快照测试 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&#xff1a; 项版本babe…

optee UTA加载

流程 动态TA按照存储位置的不同分为REE filesystem TA&#xff1a;存放在REE侧文件系统里的TA&#xff1b; Early TA&#xff1a;被嵌入到optee os里的在supplicant启动之前就可用了。 这里我们讲的是常规的存放在REE侧文件系统里的TA。 通过GP标准调用的与TA通信的命令(opens…

【Git】.gitignore 的匹配规则

每行一个规则&#xff1a;每行只能包含一个规则&#xff0c;多个规则需要分别写在不同的行上。 示例&#xff1a; # 忽略日志文件 logs/ # 忽略临时文件 temp.txt种类匹配&#xff1a; 文件&#xff1a;在规则的开头指定文件名或路径&#xff0c;如 file.txt。 示例&#xff1a…

openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL

文章目录 openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL220.1 操作步骤 openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL 系统中有些SQL语句运行了很长时间还没有结束&#xff0c;这些语句会消耗很多的系统性能&…

http“超级应用与理解”

本篇文章来介绍一下http协议和其应用 1.http协议是在OSI模型的哪一层 HTTP&#xff08;超文本传输协议&#xff09;是应用层协议&#xff0c;它是在 OSI 模型的最高层&#xff0c;即第七层——应用层。HTTP 通过互联网来传输数据和信息&#xff0c;主要用于 Web 浏览器和 Web …

CF1845 D. Rating System [思维题+数形结合]

传送门:CF [前题提要]:自己在做这道题的时候思路完全想错方向,导致怎么做都做不出来,看了题解之后感觉数形结合的思考方式挺好的(或者这种做法挺典的),故写篇题解记录一下 题目很简单,不再解释.先不考虑 k k k,想想是一种什么情况?很显然应该是跟下图一样是一个折线图的变化.…

计算机设计大赛 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

计算机组成原理(2)-----存储芯片与CPU的连接

目录 一.单块存储芯片与CPU的连接 二.多块存储芯片与CPU的连接 1.位扩展 2.字扩展 &#xff08;1&#xff09;线选法 &#xff08;2&#xff09;译码器片选法 3.字位同时扩展 三.译码器相关 一.单块存储芯片与CPU的连接 如图所示是8*8位的芯片&#xff0c;总共8个存储…

C++ 双向广度搜索,嚯嚯!不就是双指针理念吗

1. 前言 在线性数据结构中搜索时&#xff0c;常使用线性搜索算法&#xff0c;但其性能偏低下&#xff0c;其性能改善方案常有二分搜索和双指针或多指针搜索算法。在复杂的数据结构如树和图中&#xff0c;常规搜索算法是深度和广度搜索。在深度搜索算法过程中常借助剪枝或记忆化…

分布式文件系统 SpringBoot+FastDFS+Vue.js【二】

分布式文件系统 SpringBootFastDFSVue.js【二】 六、实现上传功能并展示数据6.1.创建数据库6.2.创建spring boot项目fastDFS-java6.3.引入依赖6.3.fastdfs-client配置文件6.4.跨域配置GlobalCrosConfig.java6.5.创建模型--实体类6.5.1.FastDfsFile.java6.5.2.FastDfsFileType.j…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01;

(三十九)大数据实战——Prometheus监控平台的部署搭建

前言 Prometheus监控&#xff08;Prometheus Monitoring&#xff09;是一种开源的系统监控和警报工具。它最初由SoundCloud开发并于2012年发布&#xff0c;并在2016年加入了云原生计算基金会&#xff08;CNCF&#xff09;。Prometheus监控旨在收集、存储和查询各种指标数据&am…

Android---DslTabLayout实现底部导航栏

1. 在 Android 项目中引用 JitPack 库 AGP 8. 根目录的 settings.gradle dependencyResolutionManagement {...repositories {...maven { url https://jitpack.io }} } AGP 8. 根目录如果是 settings.gradle.kts 文件 dependencyResolutionManagement {...repositories {...…

A. Desorting

链接 : Problem - A - Codeforces 题意 : 思路 : 先判断序列是否排好序 &#xff0c; 不是排好序的&#xff0c;直接输出0即可&#xff0c;排好序的 : 先求出相邻元素之间的最小间隔&#xff0c;因为&#xff0c;要使有序非递减序列&#xff0c;变得不排序&#xff0c;…

OLMo 以促进语言模型科学之名 —— OLMo Accelerating the Science of Language Models —— 全文翻译

OLMo: Accelerating the Science of Language Models OLMo 以促进语言模型科学之名 摘要 语言模型在自然语言处理的研究中和商业产品中已经变得无所不在。因为其商业上的重要性激增&#xff0c;所以&#xff0c;其中最强大的模型已经闭源&#xff0c;控制在专有接口之中&#…

Leetcode-1572. 矩阵对角线元素的和

题目&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线…

Apache httpd 换行解析漏洞复现(CVE-2017-15715)

Web页面&#xff1a; 新建一个一句话木马&#xff1a; 0.php <?php system($_GET[0]); ?> 上传木马&#xff0c; burpsuite 抓包。 直接上传是回显 bad file。 我们查看数据包的二进制内容&#xff08;hex&#xff09;&#xff0c;内容是以16进制显示的&#xff0c;…

挑战杯 wifi指纹室内定位系统

简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity&#xff0c;在中文里又称作“行动热点”&#xff0c;是Wi-Fi联盟制造商的商标做为产品的品牌认证&#xff0c;是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关&#xff…

html的列表标签

列表标签 列表在html里面经常会用到的&#xff0c;主要使用来布局的&#xff0c;使其整齐好看. 无序列表 无序列表[重要]&#xff1a; ul &#xff0c;li 示例代码1&#xff1a; 对应的效果&#xff1a; 无序列表的属性 属性值描述typedisc&#xff0c;square&#xff0c;…

U盘重装系统

因为系统管理员密码忘记&#xff0c;登录不了window系统&#xff0c;使用老毛桃制作U盘启动盘 1、下载老毛桃 下载地址为http://lmt.psydrj.com/index.html 安装后&#xff0c;桌面上显示为 2、制作U盘启动盘 启动老毛桃U盘启动装机工具&#xff0c;插入U盘&#xff0c;点击一…