C++_23_STL容器

news2024/9/24 12:34:43

文章目录

  • STL容器
  • 概念
  • 常用容器
    • A string
      • 作用
      • 构造函数
      • 基本赋值操作
      • 获取字符串长度
      • 存取字符操作
      • 拼接操作
      • 查找和替换
      • 注意:查找是不存在返回-1
      • 比较操作
      • 截取操作
      • 插入与删除
      • string与char * 转换
    • B vector
      • 概述
      • 与数组区别
      • 迭代器
      • 构造函数
      • 赋值操作
      • 插入与删除
      • 取值操作
      • 大小相关
      • 存储自定义类型
      • 容器嵌套
    • C deque
      • 概述
      • 与vector的区别
      • api
    • D stack
      • 概念
      • api
    • E List
    • F set/multiset
      • api
    • G map/multimap
  • 总结

STL容器

概念

			STL(Standard Template Library,标 准 模 板 库 ),是 惠 普 实 验 室 开 发 的 一 系 列 软 件 的 统称 。
STL 6大 组 件
容 器 :
        作 用 :容 纳 存 储 数 据
        分 类 :
            序 列 式 容 器 :
                强 调 值 的 排 序 , 每 个 元 素 均 有 固 定 的 位 置 ,  除 非 用 删 除 或 插 入 的 操
作 改 变 这 个 位 置 ,
     如  vector, deque/queue, list;
            关 联 式 容 器 :
                非 线 性 , 更 准 确 的 说 是 二 叉 树 结 构 , 各 元 素 之 间 没 有 严 格 的 物 理 上
的 顺 序 关 系 ; 
                在 数 据 中 选 择 一 个 关 键 字 key, 这 个 key对 数 据 起 到 索 引 的 作 用 , 方
便 查 找 。

                如 :  set/multiset ,  Map/multimap 容 器
        注 意 :容 器 可 以 嵌 套 容 器

    算 法 :
        作 用 :操 作 数 据 ,如 插 入 数 据 、 删 除 数 据 、 修 改 数 据 、 排 序 等
        分 类 :
            质 变 算 法 : 是 指 运 算 过 程 中 会 更 改 区 间 内 的 元 素 的 内 容 。 例 如 拷 贝 , 替
换 , 删 除 等 等

            非 质 变 算 法 : 是 指 运 算 过 程 中 不 会 更 改 区 间 内 的 元 素 内 容 , 例 如 查 找 、
计 数 、 遍 历 、 寻 找 极 值 等 等

    迭 代 器
        作 用 :容 器 与 算 法 之 间 的 粘 合 剂
        注 意 :每 个 容 器 都 有 自 己 的 迭 代 器
        分 类 :
            输 入 迭 代 器  提 供 对 数 据 的 只 读 访 问  只 读 , 支 持 ++、 ==、 ! = 
            输 出 迭 代 器  提 供 对 数 据 的 只 写 访 问  只 写 , 支 持 ++
            前 向 迭 代 器  提 供 读 写 操 作 , 并 能 向 前 推 进 迭 代 器  读 写 , 支 持 ++、
==、 ! = 
            双 向 迭 代 器  提 供 读 写 操 作 , 并 能 向 前 和 向 后 操 作  读 写 , 支 持 ++、 --,
            随 机 访 问 迭 代 器  提 供 读 写 操 作 , 并 能 以 跳 跃 的 方 式 访 问 容 器 的 任 意 数
据 , 是 功 能 最 强 的 迭 代 器 读 写 , 支 持 ++、 -- [n]、 - n、 <、 <=、 >、 >=

    仿 函 数
        作 用 :为 算 法 提 供 策 略

    适 配 器
        作 用 :为 算 法 提 供 更 多 的 参 数 接 口
           空 间 配 置 器
        作 用 :为 容 器 和 算 法 管 理 空 间

常用容器

A string

作用

存储字符的容器(字符串)

构造函数

语法


string();//创 建 一 个 空 的 字 符 串  例 如 : string str;

string(const string& str);//使 用 一 个  string 对 象 初 始 化 另 一 个  string 对 象

string(const char* s);//使 用 字 符 串  s 初 始 化

string(int n, char c);//使 用  n 个 字 符  c 初 始 化  v

示例:

void fun01()
{
    string str01;
    cout << "str01 = " << str01 << endl;
    string str02("hello");
    cout << "str02 = " << str02 << endl;
    string str03 = str02;
    cout << "str03 = " << str03 << endl;
    string str04(3,'a');
    cout << "str04 = " << str04 << endl;
}

基本赋值操作

语法


string& operator=(const char* s);//char类 型 字 符 串 赋 值 给 当 前 的 字 符 串

string& operator=(const string &s);//把 字 符 串 s赋 给 当 前 的 字 符 串

string& operator=(char c);//字 符 赋 值 给 当 前 的 字 符 串

string& assign(const char *s);//把 字 符 串 s赋 给 当 前 的 字 符 串

string& assign(const char *s, int n);//把 字 符 串 s的 前 n个 字 符 赋 给 当 前 的 字 符串

string& assign(const string &s);//把 字 符 串 s赋 给 当 前 字 符 串

string& assign(int n, char c);//用 n个 字 符 c赋 给 当 前 字 符 串

string& assign(const string &s, int start, int n);//将 s从  start开 始 n个字 符 赋 值 给 字 符 串

示例1

void fun02()
{
    string str01;
    cout << "str01 = " << str01 << endl;
    str01 = "张 十 一";
    cout << "str01 = " << str01 << endl;
    string str02;
    str02 = str01;
    cout << "str02 = " << str02 << endl;
    string str03;
    str03 = 'A';
    cout << "str03 = " << str03 << endl;
}

示例2

void fun03()
{
    // string& assign(const char *s);//把 字 符 串 s赋 给 当 前 的 字 符 串
    // string& assign(const char *s, int n);//把 字 符 串 s的 前 n个 字 符 赋 给 当前 的 字 符 串
   // string& assign(const string &s);//把 字 符 串 s赋 给 当 前 字 符 串
   // string& assign(int n, char c);//用 n个 字 符 c赋 给 当 前 字 符 串
   // string& assign(const string &s, int start, int n);//将 s从  start开 始 n个 字 符 赋 值 给 字 符 串
     string str01 = "hello";
     cout << "str01 = " << str01 << endl;
   // str01.assign("world123");
   // str01.assign("world123",5);
   // str01.assign(3,'A');
   // cout << "str01 = " << str01 << endl;
      string str02;
      str02.assign(str01, 0, 2);
      cout << "str02 = " << str02 << endl;
}

获取字符串长度

语法


int size();
int length();
注 意 :不 包 含 \0

示例


void fun04()
{
      string str = "hello";
      int size = str.size();
      cout << "size = " << size << endl;
      int len = str.length();
      cout << "len = " << len << endl;
}

存取字符操作

语法


char& operator[](int n);//通 过 []方 式 取 字 符 ,下 标 越 界 不 会 抛 出 异 常

char& at(int n);//通 过 at方 法 获 取 字 符 ,下 标 越 界 会 抛 出 异 常

示例


void fun05()
{
    string str = "hello";
    cout << str[2] << endl;
    cout << str.at(1) << endl;
}

拼接操作


string& operator+=(const string& str);//重 载 +=操 作 符

string& operator+=(const char* str);//重 载 +=操 作 符

string& operator+=(const char c);//重 载 +=操 作 符

string& append(const char *s);//把 字 符 串 s连 接 到 当 前 字 符 串 结 尾

string& append(const char *s, int n);//把 字 符 串 s的 前 n个 字 符 连 接 到 当 前 字 符串 结 尾

string& append(const string &s);//同 operator+=()

string& append(const string &s, int pos, int n);//把 字 符 串 s中 从 pos开 始 的n个 字 符 连 接 到 当 前 字 符 串 结 尾

string& append(int n, char c);//在 当 前 字 符 串 结 尾 添 加 n个 字 符 c

示例


void fun06()
{
    string str01 = "Hi";
    str01+="C++";
    cout << "str01 = " << str01 << endl;
    string str02 = " STL";
    str01+=str02;
    cout << "str01 = " << str01 << endl;
    str01+='A';
    cout << "str01 = " << str01 << endl;
}
void fun07()
{
    // string& append(const char *s);
    //把 字 符 串 s连 接 到 当 前 字 符 串 结 尾
    string str01;
    str01.append("hi");
    cout << "str01 = " << str01 << endl;
    str01.append(" c++");
    cout << "str01 = " << str01 << endl;
    // string& append(const char *s, int n);
    //把 字 符 串 s的 前 n个 字 符 连 接 到 当 前 字 符 串 结 尾
    string str02;
    str02.append("abcdefg",5);
    cout << "str02 = " << str02 << endl;
    // string& append(const string &s);
    //同 operator+=()
    // string& append(const string &s, int pos, int n);
    //把 字 符 串 s中 从 pos开 始 的 n个 字 符 连 接 到 当 前 字 符 串 结 尾
    string str03 = "1234567890";
    string str04;
    str04.append(str03,3,2);
    cout << "str04 = " << str04 << endl;
    // string& append(int n, char c);
    //在 当 前 字 符 串 结 尾 添 加 n个 字 符 c
    str04.append(2,'W');
    cout << "str04 = " << str04 << endl;
}

查找和替换

语法


int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s

注意:查找是不存在返回-1

示例

void fun08()
{
    string str = "123abc123";
    int i01 = str.find('2');
    cout << "i01 = " << i01 << endl;
    int i02 = str.find("3a");
    cout << "i02 = " << i02 << endl;
    int i03 = str.rfind('2');
    cout << "i03 = " << i03 << endl;
    str.replace(3, 3, "147258369");
    cout << "str = " << str << endl;
}

比较操作

/**
*compare函数在>时返回1,<时返回-1,==时返回0。
*比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的A比小写的a小。
**/
int compare(const string &s) const; //与字符串s比较
int compare(const char *s) const;   //与字符串s比较

截取操作

语法

string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串

示例

void fun09()
{
	string str01 = "a.txt";
	string str02 = str01.substr(1,4);
	cout << str02 << endl;
}

插入与删除

语法

string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c);//在指定位置插入n个字符c
string& erase(int pos, int n = npos);//删除从Pos开始的n个字符

示例

void fun10()
{
    // string& insert(int pos, const char* s); //插入字符串
    // string& insert(int pos, const string& str); //插入字符串
    // string& insert(int pos, int n, char c);//在指定位置插入n个字符c
    string str01 = "11";
    // 开始位置不要超出字符串下标范围
    //  str01.insert(1,"abc");
    str01.insert(1, 3, 'A');
    cout << "str01 = " << str01 << endl;
    // string& erase(int pos, int n = npos);//删除从Pos开始的n个字符
    str01.erase(1, 3);
    cout << "str01 = " << str01 << endl;
}

string与char * 转换

语法

//string转char*
string str = "itcast";
const char* cstr = str.c_str();
//char*转string
char* s = "itcast";
string str(s);

示例

void fun11()
{
    string str01 = "abc";
    string str02("abc");
    char *str03 = (char *)str01.c_str();
}

B vector

概述

  • 连 续 开 辟 ,单 向 开 口 ,随 机 访 问 迭 代 器 ,有 容 量 ,每 次 扩 容 是 原 来 的 2倍

  • 底 层 数 据 结 构 :数 组

与数组区别

>
 vector的 结 构 类 同 于 数 组 , 数 组 是 静 态 的 , 在 定 义 时 确 定 的 数 组 的 大 小 ;
 而 vector是 动 态 的 , 添 加 元 素 时 如 果 空 间 不 足 时 , 则 会 自 动 扩 容 器 ( 2^n);这 被 称 为
 vector的 未 雨 绸 缪 机 制
 整 体 来 说 , vector比 较 灵 活 的 , 而 且 vector是 类 模 板 , 可 以 存 放 任 意 类 型 的 元 素

迭代器

在这里插入图片描述

构造函数

语法

vector<T> v; //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());//将 v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);//构造函数将 n 个 elem 拷贝给本身。
vector(const vector &vec);//拷贝构造函数

示例

void fun01()
{
    vector<int> v01;
    v01.push_back(1); // 尾部添加
    v01.push_back(5);
    v01.push_back(3);
    vector<int>::iterator it = v01.begin(); // 获取开始位置的迭代器
    while (it != v01.end())                 // end():结束位置
    {
        cout << *it << endl; //*it获取当前迭代器指向的位置的值
        it++;                // 迭代器后移1位
    }
}
// =======================================
void fun02()
{
    vector<int> v01;
    v01.push_back(1); // 尾部添加
    v01.push_back(5);
    v01.push_back(3);
    vector<int> v02(v01.begin() + 1, v01.begin() + 2); // 包含开始位置,不包含结束位置(前闭后开)
    // vector<int>::iterator it = v02.begin();
    auto it = v02.begin(); // c++11及以上版本,编译时需加-std=c++11
    while (it != v02.end())
    {
        cout << *it << endl;
        it++;
    }
}
// =======================================
void fun03()
{
    vector<int> v(10, 5);
    auto it = v.begin();
    while (it != v.end())
    {
        cout << *it << endl;
        it++;
    }
}

赋值操作

语法

assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将 n 个 elem 拷贝赋值给本身。
vector& operator=(const vector &vec);//重载等号操作符
swap(vec);// 将 vec 与本身的元素互换

示例

void fun04()
{
    // assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
    // assign(n, elem);//将 n 个 elem 拷贝赋值给本身。
    // vector& operator=(const vector &vec);//重载等号操作符
    // swap(vec);// 将 vec 与本身的元素互换
    vector<int> v01;
    v01.push_back(1);
    v01.push_back(5);
    v01.push_back(3);
    v01.push_back(9);
    v01.push_back(7);
    vector<int> v02;
    // v02.assign(v01.begin(),v01.begin()+3);
    // v02.assign(5,3);
    // v02 = v01;
    v02.push_back(2);
    v02.push_back(4);
    v02.swap(v01);
    auto it = v02.begin();
    while (it != v02.end())
    {
        cout << *it << endl;
        it++;
    }
    cout << "---------------" << endl;
    auto it01 = v01.begin();
    while (it01 != v01.end())
    {
        cout << *it01 << endl;
        it01++;
    }
}

插入与删除

语法

push_back(ele); 
//尾部插入元素 ele

insert(const_iterator pos, int count, T ele);
//迭代器指向位置 pos 插入count个元素ele.

pop_back();
//删除最后一个元素

erase(const_iterator start, const_iterator end); 
//删除迭代器从 start到 end 之间的元素,删除[start, end)区间的所有元素

erase(const_iterator pos); 
//删除迭代器指向的元素

clear(); 
//删除容器中所有元素

示例

void fun05()
{
    vector<int> v;
    // push_back(ele); //尾部插入元素 ele
    v.push_back(1);
    v.push_back(3);
    v.push_back(5);
    v.push_back(7);
    // insert(const_iterator pos, int count, T ele); //迭代器指向位置pos 插入 count个元素ele.v.insert(v.begin(), 1, 0);
    // pop_back();//删除最后一个元素
    v.pop_back();
    // v.pop_back();
    //  erase(const_iterator start, const_iterator end); //删除迭代器从start 到 end 之间的元素,删除[start, end)区间的所有元素
    v.erase(v.begin() + 1, v.begin() + 3);
    // erase(const_iterator pos); //删除迭代器指向的元素
    v.erase(v.begin());
    // clear(); //删除容器中所有元素
    v.clear();
    auto it = v.begin();
    while (it != v.end())
    {
        cout << *it << endl;
        it++;
    }
}

取值操作

语法

at(int idx); //返回索引 idx 所指的数据,如果 idx 越界,抛出 out_of_range异常。
operator[](int idx); //返回索引 idx 所指的数据,越界时,不会直接报错
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素

示例

void fun06()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(5);
    v.push_back(7);
    // at(int idx); //返回索引 idx 所指的数据,如果 idx 越界,抛出
    out_of_range 异常。
            cout
        << "v.at(3) = " << v.at(3) << endl;
    // operator[](int idx); //返回索引 idx 所指的数据,越界时,不会报错
    cout << "v[2] = " << v[100] << endl;
    // front(); //返回容器中第一个数据元素
    cout << v.front() << endl;
    // back(); //返回容器中最后一个数据元素
    cout << v.back() << endl;
}

大小相关

语法

int size(); // 返回容器中元素的个数
bool empty(); //判断容器是否为空, 返回bool值(0, 1)
void resize(int num); //重新指定容器的长度为 num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
void resize(int num, elem); //重新指定容器的长度为 num,若容器变长,则以elem 值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
int capacity(); //容器的容量
void reserve(int len); //容器预留 len 个元素长度

示例

void fun07()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(5);
    v.push_back(7);
    v.push_back(9);
    // int size(); // 返回容器中元素的个数
    // cout << v.size() << endl;
    // bool empty(); //判断容器是否为空, 返回bool值(0, 1)
    // cout << v.empty() << endl;
    // void resize(int num); //重新指定容器的长度为 num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
    // v.resize(2);
    // void resize(int num, elem); //重新指定容器的长度为 num,若容器变长,则以 elem 值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
    // v.resize(10,10);
    // int capacity(); //容器的容量
    cout
        << v.capacity() << endl;
    // void reserve(int len); //容器预留 len 个元素长度
    v.reserve(10);
    cout << v.capacity() << endl;
    // auto it = v.begin();
    // while(it != v.end())
    // {
    // cout << *it << endl;
    // it++;
    // }
}
void fun08()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(5);
    v.push_back(7);
    v.push_back(9);
    cout << "v的大小 = " << v.size() << endl;
    cout << "v的容量 = " << v.capacity() << endl;
    vector<int>(v).swap(v);
    cout << "v的大小 = " << v.size() << endl;
    cout << "v的容量 = " << v.capacity() << endl;
}

存储自定义类型

示例

class Per
{
public:
    char *name;
    Per(char *name)
    {
        this->name = name;
    }
};
void fun09()
{
    vector<Per> ps;
    ps.push_back(Per("张三"));
    ps.push_back(Per("李四"));
    ps.push_back(Per("王五"));
    for (auto it = ps.begin(); it != ps.end(); it++)
    {
        cout << (*it).name << endl;
    }
}

容器嵌套

void fun10()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    vector<int> v2;
    v2.push_back(100);
    v2.push_back(200);
    v2.push_back(300);
    v2.push_back(400);
    v2.push_back(500);
    vector<int> v3;
    v3.push_back(1000);
    v3.push_back(2000);
    v3.push_back(3000);
    v3.push_back(4000);
    v3.push_back(5000);
    vector<vector<int>> v;
    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);
    vector<vector<int>>::iterator it = v.begin();
    for (; it != v.end(); it++)
    {
        //*it == vector<int>
        vector<int>::iterator mit = (*it).begin();
        for (; mit != (*it).end(); mit++)
        {
            //*mit==int
            cout << *mit << " ";
        }
        cout << endl;
    }
}

C deque

概述

>deque 则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分
别做元素的插入和删除操作
	数据结构:数组

与vector的区别

  • 一 在 于 deque 允 许 使 用 常 数 项 时 间 对 头 端 进 行 元 素 的 插 入 和 删 除 操 作 。

  • 二 在 于 deque 没 有 容 量 的 概 念 , 因 为 它 是 动 态 的 以 分 段 连 续 空 间 组 合 而 成 , 随 时 可 以

    增 加 一 段 新 的 空 间 并 链 接 起 来

在这里插入图片描述

在这里插入图片描述

api

//构 造 函 数
deque<T> deqT;//默 认 构 造 形 式
deque(beg, end);//构 造 函 数 将 [beg, end)区 间 中 的 元 素 拷 贝 给 本 身 。
deque(n, elem);//构 造 函 数 将  n 个  elem 拷 贝 给 本 身 。
deque(const deque &deq);//拷 贝 构 造 函 数

//赋 值 操 作
assign(beg, end);//将 [beg, end)区 间 中 的 数 据 拷 贝 赋 值 给 本 身 。
assign(n, elem);//将  n 个  elem 拷 贝 赋 值 给 本 身 。
deque& operator=(const deque &deq); //重 载 等 号 操 作 符
swap(deq);// 将  deq 与 本 身 的 元 素 互 换

//大 小 操 作
deque.size();//返 回 容 器 中 元 素 的 个 数
deque.empty();//判 断 容 器 是 否 为 空


deque.resize(num);//重 新 指 定 容 器 的 长 度 为  num,若 容 器 变 长 , 则 以 默 认 值 填 充 新位 置 。 如 果 容 器 变 短 , 则 末 尾 超 出 容 器 长 度 的 元 素 被 删 除 。

deque.resize(num, elem); //重 新 指 定 容 器 的 长 度 为  num,若 容 器 变 长 , 则 以  elem 值 填 充 新 位 置 ,如 果 容 器 变 短 , 则 末 尾 超 出 容 器 长 度 的 元 素 被 删 除 。

//双 端 插 入 和 删 除 操 作
push_back(elem);//在 容 器 尾 部 添 加 一 个 数 据
push_front(elem);//在 容 器 头 部 插 入 一 个 数 据
pop_back();//删 除 容 器 最 后 一 个 数 据
pop_front();//删 除 容 器 第 一 个 数 据

//数 据 存 取
at(idx);//返 回 索 引  idx 所 指 的 数 据 , 如 果  idx 越 界 , 抛 出  out_of_range。
operator[];//返 回 索 引  idx 所 指 的 数 据 , 如 果  idx 越 界 , 不 抛 出 异 常 , 直 接 出错 。

front();//返 回 第 一 个 数 据 。
back();//返 回 最 后 一 个 数 据

//插 入 操 作
insert(pos,elem);//在  pos 位 置 插 入 一 个  elem 元 素 的 拷 贝 , 返 回 新 数 据 的 位 置 。
insert(pos,n,elem);//在  pos 位 置 插 入  n 个  elem 数 据 , 无 返 回 值 。
insert(pos,beg,end);//在  pos 位 置 插 入 [beg,end)区 间 的 数 据 , 无 返 回 值 。

//删 除 操 作
clear();//移 除 容 器 的 所 有 数 据
erase(beg,end);//删 除 [beg,end)区 间 的 数 据 , 返 回 下 一 个 数 据 的 位 置 。
erase(pos);//删 除  pos 位 置 的 数 据 , 返 回 下 一 个 数 据 的 位 置 。

D stack

概念

栈 (先 进 后 出 ,又 名 水 桶 ),单 向 开 口 ,没 有 迭 代 器

在这里插入图片描述

api

构 造 函 数
stack<T> stkT;//stack 采 用 模 板 类 实 现 ,  stack 对 象 的 默 认 构 造 形 式 :
stack(const stack &stk);//拷 贝 构 造 函 数

赋 值 操 作
stack& operator=(const stack &stk);//重 载 等 号 操 作 符

数 据 存 取 操 作
push(elem);//向 栈 顶 添 加 元 素
pop();//从 栈 顶 移 除 第 一 个 元 素
top();//返 回 栈 顶 元 素

大 小 操 作
empty();//判 断 堆 栈 是 否 为 空
size();//返 回 堆 栈 的 大 小

示例

#include <iostream>
#include <stack>
using namespace std;
int main(int argc, char const *argv[])
{
    stack<int> s;
    s.push(1);
    s.push(5);
    s.push(3);
    s.push(7);
    // while(s.size() != 0)
    // {
    // cout << s.top() << endl;
    // s.pop();
    // }
    while (!s.empty())
    {
        cout << s.top() << endl;
        s.pop();
    }
    return 0;
}

E queue

概念

  • 队 列 (先 进 先 出 ),又 名 水 管 ,双 向 开 口 ,没 有 迭 代 器
    • 队 头 :出 数 据
    • 队 尾 :入 数 据

api

构 造 函 数

queue<T> queT;//queue 采 用 模 板 类 实 现 , queue 对 象 的 默 认 构 造 形 式 :
queue(const queue &que);//拷 贝 构 造 函 数

存 取 、 插 入 和 删 除 操 作

push(elem);//往 队 尾 添 加 元 素
pop();//从 队 头 移 除 第 一 个 元 素
back();//返 回 最 后 一 个 元 素
front();//返 回 第 一 个 元 素

赋 值 操 作

queue& operator=(const queue &que);//重 载 等 号 操 作 符

大 小 操 作

empty();//判 断 队 列 是 否 为 空
size();//返 回 队 列 的 大 小

示例

#include <iostream>
#include <queue>
using namespace std;
int main(int argc, char const *argv[])
{
    queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);
    while (!q.empty())
    {
        cout << q.front() << endl;
        q.pop();
    }
    return 0;
}

E List

概念

  • 基 于 双 向 链 表 的 ,离 散 存 储 的 ,双 向 迭 代 器 ,元 素 可 重 复
    • 数 据 结 构 :链 表

双 向 迭 代 器 :可 以 ++,–,但 是 不 能 +,-

在这里插入图片描述

api

构 造 函 数

   list<T> lstT;//list 采 用 采 用 模 板 类 实 现 ,对 象 的 默 认 构 造 形 式 :
   list(beg,end);//构 造 函 数 将 [beg, end)区 间 中 的 元 素 拷 贝 给 本 身 。
   list(n,elem);//构 造 函 数 将  n 个  elem 拷 贝 给 本 身 。
   list(const list &lst);//拷 贝 构 造 函 数 。

数 据 元 素 插 入 和 删 除 操 作

   push_back(elem);//在 容 器 尾 部 加 入 一 个 元 素
   pop_back();//删 除 容 器 中 最 后 一 个 元 素
   push_front(elem);//在 容 器 开 头 插 入 一 个 元 素
   pop_front();//从 容 器 开 头 移 除 第 一 个 元 素
   insert(pos,elem);//在  pos 位 置 插  elem 元 素 的 拷 贝 , 返 回 新 数 据 的 位 置 。
   insert(pos,n,elem);//在  pos 位 置 插 入  n 个  elem 数 据 , 无 返 回 值 。

 


   insert(pos,beg,end);//在  pos 位 置 插 入 [beg,end)区 间 的 数 据 , 无 返 回 值 。
   clear();//移 除 容 器 的 所 有 数 据
   erase(beg,end);//删 除 [beg,end)区 间 的 数 据 , 返 回 下 一 个 数 据 的 位 置 。
   erase(pos);//删 除  pos 位 置 的 数 据 , 返 回 下 一 个 数 据 的 位 置 。
   remove(elem);//删 除 容 器 中 所 有 与  elem 值 匹 配 的 元 素 。

大 小 操 作

   size();//返 回 容 器 中 元 素 的 个 数
   empty();//判 断 容 器 是 否 为 空
   resize(num);//重 新 指 定 容 器 的 长 度 为  num, 若 容 器 变 长 , 则 以 默 认 值 填 充 新 位置 。 如 果 容 器 变 短 , 则 末 尾 超 出 容 器 长 度 的 元 素 被 删 除 。

   resize(num, elem);//重 新 指 定 容 器 的 长 度 为  num,若 容 器 变 长 , 则 以  elem 值填 充 新 位 置 。 如 果 容 器 变 短 , 则 末 尾 超 出 容 器 长 度 的 元 素 被 删 除 。

赋 值 操 作

   assign(beg, end);//将 [beg, end)区 间 中 的 数 据 拷 贝 赋 值 给 本 身 。
   assign(n, elem);//将  n 个  elem 拷 贝 赋 值 给 本 身 。
   list& operator=(const list &lst);//重 载 等 号 操 作 符
   swap(lst);//将  lst 与 本 身 的 元 素 互 换 。

数 据 的 存 取

   front();//返 回 第 一 个 元 素 。
   back();//返 回 最 后 一 个 元 素 。

反 转 排 序

   reverse();//反 转 链 表 , 比 如  lst 包 含  1,3,5 元 素 , 运 行 此 方 法 后 , lst 就 包含  5,3,1元 素 
   sort(); //list 排 序

示例

#include <iostream>
#include <list>
#include <string>
using namespace std;
void showList(list<int> nums)
{
    list<int>::iterator it = nums.begin();
    for (; it != nums.end(); it++)
    {
        cout << *it << endl;
    }
}
void fun01()
{
    list<int> nums;
    nums.push_back(1);
    nums.push_back(5);
    nums.push_back(3);
    nums.push_back(7);
    nums.reverse();
    showList(nums);
}
void fun02()
{
    list<int> nums;
    nums.push_back(1);
    nums.push_back(5);
    nums.push_back(3);
    nums.push_back(7);
    nums.sort();
    showList(nums);
}
void fun03()
{
    list<int> nums;
    nums.push_back(1);
    nums.push_back(5);
    nums.push_back(3);
    nums.push_back(7);
    nums.sort();
    nums.reverse();
    showList(nums);
}
class Person
{
private:
    string name;

public:
    Person()
    {
        name = "";
    }
    Person(char *name)
    {
        this->name = name;
    }
    Person(const Person &p)
    {
        this->name = p.name;
    }
    string &getName()
    {
        return name;
    }
};
int main(int argc, char const *argv[])
{
    list<Person> ps;
    ps.push_back(Person("张三"));
    ps.push_back(Person("李四"));
    ps.push_back(Person("王五"));
    list<Person>::iterator it;
    for (it = ps.begin(); it != ps.end(); it++)
    {
        cout << (*it).getName() << endl;
    }
    return 0;
}

F set/multiset

set特点

  • Set 的 特 性 是 。 所 有 元 素 都 会 根 据 元 素 的 键 值 自 动 被 排 序 。
  • Set 容 器 的 键 值 和 实 值 是 同 一 个 值 。
  • Set 不 允 许 两 个 元 素 有 相 同 的 键 值 。
  • Set容 器 的 迭 代 器 是 只 读 迭 代 器 。 插 入 数 据 后 不 允 许 修 改 set的 键 值 。
    • 数 据 结 构 :红 黑 树

注 意 :

如 果 存 入 的 值 大 于 原 有 的 值 ,此 时 x > y 为 真 ,存 入 的 值 在 原 有 值 左 边

如 果 存 储 的 值 小 于 原 有 的 值 ,此 时 x > y 为 假 ,交 换 在 比 较

如 果 交 换 后 ,存 储 的 值 为 y,原有值的为 x,此 时 x > y 为真 ,存入的值不应该在原有值 左 边

如 果 交 换 后 ,存 储 的 值 为 y,原 有 值 的 为 x,此 时 x > y 为 假 ,此时证明不符合其存储 原 则

multiset特点

  • multiset 特 性 及 用 法 和 set 完 全 相 同 , 唯 一 的 差 别 在 于 它 允 许 键 值 重 复 。
    • 数 据 结 构 :红 黑 树

api

构 造 函 数

set<T> st;//set 默 认 构 造 函 数 :
mulitset<T> mst; //multiset 默 认 构 造 函 数 :
set(const set &st);//拷 贝 构 造 函 数

赋 值 操 作

set& operator=(const set &st);//重 载 等 号 操 作 符
swap(st);//交 换 两 个 集 合 容 器

大 小 操 作

size();//返 回 容 器 中 元 素 的 数 目
empty();//判 断 容 器 是 否 为 空

插 入 和 删 除 操 作

insert(elem);//在 容 器 中 插 入 元 素 。
clear();//清 除 所 有 元 素
erase(pos);//删 除  pos 迭 代 器 所 指 的 元 素 , 返 回 下 一 个 元 素 的 迭 代 器 。
erase(beg, end);//删 除 区 间 [beg,end)的 所 有 元 素  , 返 回 下 一 个 元 素 的 迭 代 器 。
erase(elem);//删 除 容 器 中 值 为  elem 的 元 素 。

查 找 操 作

find(key);//查 找 键  key 是 否 存 在 ,若 存 在 , 返回该键的元素的迭代器;若不存在返回set.end();
count(key);//查 找 键  key 的 元 素 个 数
lower_bound(keyElem);//下 限 返 回 第 一 个  key>=keyElem 元 素 的 迭 代 器 。
upper_bound(keyElem);//上 限 返 回 第 一 个  key>keyElem 元 素 的 迭 代 器 。
equal_range(keyElem);//返 回 容 器 中  key 与  keyElem 相 等 的 上 下 限 的 两 个 迭 代器 。

示例

#include <iostream>
#include <set>
using namespace std;
void fun01()
{
    set<int> s;
    s.insert(3);
    s.insert(2);
    s.insert(6);
    s.insert(5);
    s.insert(1);
    s.insert(1); // 存储的元素不允许重复
    set<int>::const_iterator it = s.begin();
    while (it != s.end())
    {
        cout << *it << endl;
        it++;
    }
}
void fun02()
{
    multiset<int> s;
    s.insert(3);
    s.insert(2);
    s.insert(6);
    s.insert(5);
    s.insert(1);
    s.insert(1); // 存储的元素允许重复
    multiset<int>::const_iterator it = s.begin();
    while (it != s.end())
    {
        cout << *it << endl;
        it++;
    }
}
class MyCompare
{
public:
    bool operator()(int x, int y)
    {
        return x > y;
    }
};
void fun03()
{
    // 自定义比较器
    set<int, MyCompare> s;
    s.insert(3);
    s.insert(4);
    // s.insert(2);
    // s.insert(5);
    set<int>::const_iterator it = s.begin();
    while (it != s.end())
    {
        cout << *it << endl;
        it++;
    }
}
class MyCompareP;
class Person
{
    friend class MyCompareP;
    friend void fun04();

private:
    string name;
    int age;

public:
    Person()
    {
        name = "";
    }
    Person(char *name, int age)
    {
        this->name = name;
        this->age = age;
    }
    Person(const Person &p)
    {
        this->name = p.name;
        this->age = p.age;
    }
    string &getName()
    {
        return name;
    }
};
class MyCompareP
{
public:
    bool operator()(Person p1, Person p2)
    {
        return p1.age <= p2.age;
    }
};
void fun04()
{
    set<Person, MyCompareP> s;
    s.insert(Person("张三", 18));
    s.insert(Person("李四", 16));
    s.insert(Person("王五", 19));
    s.insert(Person("赵六", 18));
    cout << "size = " << s.size() << endl;
    set<Person>::const_iterator it;
    for (it = s.begin(); it != s.end(); it++)
    {
        cout << (*it).name << endl;
    }
}
int main(int argc, char const *argv[])
{
    fun04();
    return 0;
}
#include <iostream>
#include <set>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
    set<int> ns;
    ns.insert(10);
    ns.insert(20);
    ns.insert(30);
    ns.insert(40);
    // lower_bound(keyElem);//下限返回第一个 key>=keyElem 元素的迭代器。
    auto it01 = ns.lower_bound(30);
    cout << *it01 << endl;
    // upper_bound(keyElem);//上限返回第一个 key>keyElem 元素的迭代器
    auto it02 = ns.upper_bound(30);
    cout << *it02 << endl;
    pair<set<int>::iterator, set<int>::iterator> p = ns.equal_range(30);
    cout << *(p.first) << endl;  // 键是下限
    cout << *(p.second) << endl; // 值是上限
    return 0;
}

G map/multimap

map概述

  • 键 值 对 的 形 式 存 储 数 据 ,一 个 键 值 对 称 为 一 个 对 组

  • 这 一 对 值 可 以 具 有 不 同 的 数 据 类 型 , 两 个 值 可 以 分 别 用 pair(对 组 ) 的 两 个 公 共 的 成 员

    变 量 first(键 ) 和 second(值 )访 问 。

不 允 许 键 重 复

multimap概述

允 许 键 重 复

api

map 构 造 函 数
map<T1, T2> mapTT;//map 默 认 构 造 函 数 : 
    T1:键 的 数 据 类 型 ,要 有 可 比 较 性 ,基 本 数 据 类 型 都 有 可 比 性
    T2:值 的 数 据 类 型
map(const map &mp);//拷 贝 构 造 函 数

map 赋 值 操 作
map& operator=(const map &mp);//重 载 等 号 操 作 符
swap(mp);//交 换 两 个 集 合 容 器

map 大 小 操 作
size();//返 回 容 器 中 元 素 的 数 目
empty();//判 断 容 器 是 否 为 空

map 插 入 数 据 元 素 操 作
map.insert(...); //往 容 器 插 入 元 素 , 返 回  pair<iterator,bool>

map 删 除 操 作
clear();//删 除 所 有 元 素
erase(pos);//删 除  pos 迭 代 器 所 指 的 元 素 , 返 回 下 一 个 元 素 的 迭 代 器 。
erase(beg,end);//删 除 区 间 [beg,end)的 所 有 元 素  , 返 回 下 一 个 元 素 的 迭 代 器 。
erase(keyElem);//删 除 容 器 中  key 为  keyElem 的 对 组 。

map 查 找 操 作
find(key);//查找键 key 是否存在,若存在返回该键的元素的迭代器;若不存在,返回  map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是 0,要么是1,对multimap 来说,值可能大于1。
lower_bound(keyElem);//返 回 第 一 个  key>=keyElem 元 素 的 迭 代 器 。
upper_bound(keyElem);//返 回 第 一 个  key>keyElem 元 素 的 迭 代 器 。
equal_range(keyElem);//返 回 容 器 中  key 与  keyElem 相 等 的 上 下 限 的 两 个 迭 代
器 。

总结

vector 单 端 动 态 数 组 随 机 访 问 迭 代 器 (重 点 )
比 如 软 件 历 史 操 作 记 录 的 存 储 , 我 们 经 常 要 查 看 历 史 记 录 , 比 如 上 一 次 的 记 录 , 上 上 次

的 记 录 , 但 却 不 会 去 删 除 记 录 , 因 为 记 录 是 事 实 的 描 述 。

数 据 结 构 :数 组

deque: 双 端 动 态 数 组 随 机 访 问 迭 代 器

deque 的 使 用 场 景 : 比 如 排 队 购 票 系 统 , 对 排 队 者 的 存 储 可 以 采 用 deque, 支 持 头 端
的 快 速 移 除 , 尾 端 的 快 速 添 加

stack栈 容 器 没 有 迭 代 器 先 进 后 出
queue队 列 容 器 没 有 迭 代 器 先 进 先 出

list 链 表 容 器 双 向 迭 代 器 (重 点 )
比 如 公 交 车 乘 客 的 存 储 , 随 时 可 能 有 乘 客 下 车 , 支 持 频 繁 的 不 确 实 位 置 元 素 的 移 除 插 入

数 据 结 构 :双 链 表

set 容 器 只 有 键 值 键 值 不 能 重 复 自 动 排 序 只 读 迭 代 器
比 如 对 手 机 游 戏 的 个 人 得 分 记 录 的 存 储 , 存 储 要 求 从 高 分 到 低 分 的 顺 序 排 列 。
数 据 结 构 :红 黑 树

map容 器 : 键 值 -实 值 成 对 出 现 键 值 不 能 重 复 自 动 排 序 只 读 迭 代 器 (重 点 )
比 如 按 ID 号 存 储 十 万 个 用 户 , 想 要 快 速 要 通 过 ID 查 找 对 应 的 用 户 。
数 据 结 构 :红 黑 树

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 安装 tomcat9、java环境

一、安装 Java环境 1. 下载文件 https://repo.huaweicloud.com/java/jdk/ 或者网盘&#xff1a;通过网盘分享的文件&#xff1a;jdk-8u192-linux-x64.tar.gz 链接: https://pan.baidu.com/s/1V3pQWzgSLJxdrUdmmKueRA 提取码: qspw 2. 查看Linux系统是否有自带的jdk&#xf…

智慧水利采砂船在线监控平台:构建高效、智能的河道采砂监管体系

随着科技的不断发展&#xff0c;水利行业的智慧化转型也日益受到重视。智慧水利采砂船在线监控平台便是这一转型的重要成果之一。该平台主要服务于水政执法人员&#xff0c;针对取得河道采砂许可证的采砂公司及采砂船&#xff0c;实施在线自动监控&#xff0c;旨在提高监管效率…

评论表设计与实现(多级评论)

首先分析评论的类型 对文章的回复&#xff08;也称根回复或一级回复&#xff09;对根评论的回复 &#xff08;二级回复&#xff0c;被回复的评论id和根评论相同&#xff09;对回复的回复&#xff08;二级回复&#xff0c;被回复的评论id和根评论不同&#xff09; 抽象出数据库…

if __name__ == ‘__main__‘: 在 Python 中的作用

Python Python 是一种广泛使用的高级编程语言&#xff0c;它以其易读性和简洁的语法而闻名。Python 支持多种编程范式&#xff0c;包括面向对象、命令式、函数式和过程式编程。它由 Guido van Rossum 创建&#xff0c;并在 1991 年首次发布。 Python 的一些关键特性包括&#…

MacOS Catalina 从源码构建Qt6.2开发库之02: 配置QtCreator

安装Qt-creator-5.0.2 在option命令中配置Qt Versions指向 /usr/local/bin/qmake6 Kits选入CLang

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 遇到SSH连接银河麒麟V10SP1时“connection reset by ip地址 port 22”的错误&#xff0c;可以尝试以下步…

GNU链接器(LD):设置入口点(ENTRY命令)的用法及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

#嵌入式笔面经分享#科大讯飞公司嵌入式硬件面经(第1面)

DNS是什么 DNS&#xff08;Domain Name System&#xff09;是一种用于将域名转换为IP地址的分布式命名系统。它充当 7.12 440 一个组产出最 7.12 440 一个组产出最多的是组长&#xff0c;是管理&#xff0c;这个组不正常。​出一个小学数学应用题&#xff1a;在 OSI七层模型?…

基于二自由度汽车模型的汽车质心侧偏角估计

一、质心侧偏角介绍 在车辆坐标系中&#xff0c;质心侧偏角通常定义为质心速度方向与车辆前进方向的夹角。如下图所示&#xff0c;u为车辆前进方向&#xff0c;v为质心速度方向&#xff0c;u和v之间的夹角便是质心侧偏角。 质心侧偏角的作用有如下三点&#xff1a; 1、稳定性…

什么是反射,反射用途,spring哪些地方用到了反射,我们项目中哪些地方用到了反射

3分钟搞懂Java反射 一、反射是什么 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的工具&#xff0c;它允许程序在运行时获取和操作类、接口、构造器、方法和字段等。反射是Java语言的一个重要特性&#xff0c;它为开发人员提供了许多灵活性&#xf…

PHP探索校园新生态校园帮小程序系统小程序源码

探索校园新生态 —— 校园帮小程序系统&#xff0c;让生活更精彩&#xff01; &#x1f331;【开篇&#xff1a;走进未来校园&#xff0c;遇见新生态】&#x1f331; 你是否厌倦了传统校园的繁琐与单调&#xff1f;是否渴望在校园里也能享受到便捷、智能的生活体验&#xff1…

APS软件:生产计划排程的秩序守护者

生产计划制定 &#xff08;1&#xff09;APS排程是一种高度精细化的生产计划制定方法&#xff0c;它精准地计算出不同产品不同工序生产任务的起始、结束时间、每段工序加工时间内的生产数量以及产品的整个生产周期&#xff0c;同时全面考量设备性能、人员配置、物料供应等关键…

全球地图——为论文增色

✨全球地图是全球研究常用的结果表现形式&#xff0c;随着学科交叉&#xff0c;很多非地学&#xff08;环境、化学、生物等&#xff09;的顶刊也会运用到全球地图&#xff0c;为结果增色不少 ✨我总结了一些顶刊 (NSP&#xff0c;NG&#xff0c;NC)最新发布的相关图表✨ 这些图…

st7735调试记录

由于该模块陪我已经超过十年&#xff0c;最近想起来学习下lvgl&#xff0c;于是乎将其拿出来&#xff0c;尝试使能该模块从而学会lvgl 第一步肯定是找到资料确定下该模块是否好用。于是到网络上找到如下资料进行验证&#xff1a; https://pan.baidu.com/s/1CEunLuGUqLABR6I0UZ…

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 一. 介绍二. 代码示例2.1 抽象构件&#xff08;Component&#xff09;角色2.2 具体构件&#xff08;Concrete Component&#xff09;角色2.3 装饰&#xff08;Decorator&#xff09;角色2.4 具体装饰&#xff08;Concrete Decorator&#xff09;角色2.5 测试 结…

mysql 报 ERROR 1273: Unknown collation: ‘utf8mb4_0900_ai_ci‘ 的处理

1、数据库sql是mysql8的导出的&#xff0c;本机上安装的还是5.7的版本&#xff0c;然后导入sql&#xff0c;直接就报错。 2、mysql的下载地址&#xff1a; MySQL :: Download MySQL Community Server 3、报错截图&#xff1a; 4、重新选择一个collation就可以了&#xff0c;…

MoNA:复用跨模态预训练模型,少样本模态的福音 | ICML‘24

跨模态转移旨在利用大型预训练模型来完成可能不属于预训练数据模态的任务。现有的研究在将经典微调扩展到跨模态场景方面取得了一定的成功&#xff0c;但仍然缺乏对模态差距对转移的影响的理解。在这项工作中&#xff0c;进行了一系列关于转移过程中源表示质量的实验&#xff0…

最新视频号名字使用规范你了解了吗!

文章来源&#xff1a;视频号官方平台 视频号名字使用需遵循以下规范&#xff1a; 账号名字应当与简介的内容相符&#xff0c;且不得与已注册成功的账号名字重复。 账号超过180天未以视频号身份进行发表、评论等操作&#xff0c;将不再受到名字唯一保护&#xff0c;有其他用户申…

FPGA实现频率、幅度、相位可调的DDS以及DDS Compiler IP核的使用验证

文章目录 一、DDS介绍二、DDS原理2.1 频率计算2.2 相位改变2.3 波形切换 三、Matlab生成波形文件四、FPGA实现DDS4.1 Verilog代码4.2 仿真验证4.2.1 改变频率4.2.2 切换波形4.2.3 相位调节4.2.4 幅度调节 五、Xilinx DDS Compiler的使用5.1 功能框图5.1.1 相位累加器5.1.2 SIN/…

通俗讲解javascript的实例对象、原型对象和构造函数以及它们之间的关系

今天通俗讲解一下js的对象&#xff0c;因为要通俗&#xff0c;所以可能描述不甚准确。 在js中&#xff0c;想要创建一个对象&#xff0c;首先要写出构造函数&#xff08;跟其它的语言不太一样哦&#xff0c;其它语言一般都会先写一个class 类名&#xff09;。 构造函数写法如…