C++ 之结构体与共用体
文章目录
- 参考
- 描述
- 结构体
- 使用(基本)
- 声明
- 初始化
- 先创建后初始化
- C++ 11 列表初始化
- 使用(进阶)
- 结构数组
- 声明(拓展)
- 声明及创建
- 声明及初始化
- 匿名结构体
- 细节
- 外部声明与内部声明
- 成员赋值
- 共用体
- 存储空间
- 匿名共用体
- 同化
- 尾声
参考
项目 | 描述 |
---|---|
搜索引擎 | Bing |
C++ Primer Plus(第六版) | 史蒂芬·普拉达 |
描述
项目 | 描述 |
---|---|
g++ | 8.1.0 |
操作系统 | Windows 10 专业版 |
结构体
在 C++ 中,能够同时存储多个元素的复合类型除了数组外还有结构体。两者的区别在于:
-
一个数组中的每一个元素都必须属于同一种数据类型。你可以创建一个整型数组,但其中不能出现除整型数据类型外的其他数据类型,比如单精度浮点型(float)及字符型(char)。
-
一个结构体中可以同时存在多个元素,且这些元素的数据类型没有限制。
使用(基本)
声明
声明一个结构体时你需要使用到 struct 关键字。
举个栗子
// 导入 iostream 以使 C++ 程序具有基本的输入输出功能
#include <iostream>
// 导入 string 以使用 String 类创建字符串
// 使用 String 类创建字符串将获得更多的支持
#include <string>
// 使用标准名称空间 std
using namespace std;int main() {// 声明一个结构体struct Mark{// 在结构体中声明一个用于存放字符串的变量string name;// 在结构体中声明一个用于存放整型数据的变量int age;}; // 注意这个分号// 使用 system() 函数以使得窗口暂停system("pause");
}
注:
-
使用 struct 关键字创建了一个结构体后,你需要使用一个名称去对其进行标记。在本示例中我们将声明的结构体标记为 Mark 。
-
在结构体中声明的变量可以使用所有的 C++ 所支持的类型。
-
在声明结构体后,请不要忘记末尾的分号。将该分号省略,C++ 将会抛出错误。
初始化
先创建后初始化
举个栗子
#include <iostream>
#include <string>
using namespace std;int main() {// 声明结构体struct Info{string name;int age;};// 创建结构体Info info;// 此时 info 中的相关数据尚未被初识化,// 故从 info 中取出的数据不能确定。cout << info.name << endl;cout << info.age << endl;// 初始化结构体info.name = "RedHeart";info.age = 18;cout << "-------------***---------------" << endl;cout << info.name << endl;cout << info.age << endl;system("pause");
}
执行效果
8
-------------***---------------
RedHeart
18
请按任意键继续. . .
C++ 11 列表初始化
#include <iostream>
#include <string>
using namespace std;int main() {struct Info{string name;int age;};// 通过初始化列表对结构体进行初始化操作Info info = {"RedHeart",18};// 对结构体中的数据进行访问cout << info.name << endl;cout << info.age << endl;system("pause");
}
执行效果
RedHeart
18
请按任意键继续. . .
注:
-
使用列表初始化方式对结构体进行初始化时不能发生同类数据类型之间的缩窄转换(范围,精度),即不能将(仅列出部分):
- 浮点型字面量(也可以称之为常量,即直接在程序中写出的数据)提供给整型变量。
- 整型常量提供给字符型变量。
- 双精度浮点型字面量提供给单精度浮点型常量。
-
使用列表初始化对结构体进行初始化但未对结构体中的变量指定值,则该变量将被初始化为 0 。例如:
#include <iostream>
#include <string>
using namespace std;int main() {struct Info{string name;int age;};// 使用列表初始化为结构体进行初始化操作,但未// 为 age 变量指定值,这将导致该变量被初始化为零。Info info = {"RedHeart"};Info test = {};cout << info.name << endl;cout << info.age << endl;system("pause");
}
执行结果
RedHeart
0
请按任意键继续. . .
-
使用列表初识化对结构体进行初识化操作时,关键字 struct 及 = 均可以省略。
- 完整形式
// 声明一个结构体 struct Info{};// 对结构体进行初始化 struct Info info = {};
- 简写形式
// 声明一个结构体 struct Info{};// 对结构体进行初始化 // struct 关键字仅能在初始化过程中被省略 Info info {};
使用(进阶)
结构数组
你可以创建一个元素为结构体的数组,方法和创建基本类型数组完全相同。
举个栗子
#include <iostream>
#include <string>
using namespace std;int main() {struct Arr{string name;int age;};// 创建长度为 2 的结构数组Arr arr[2] {{"RedHeart", 18},{"TwoMoons"}};// 对结构数组中的元素进行访问cout << arr[0].name << '\t' << arr[0].age << endl;cout << arr[1].name << '\t' << arr[1].age << endl;system("pause");
}
执行结果
RedHeart 18
TwoMoons 0
请按任意键继续. . .
声明(拓展)
在前面,我们都是先对结构体进行声明后对其实现创建及初始化的。但其实,结构体的声明与结构体的创建及结构体的初始化是可以同时进行的。
声明及创建
#include <iostream>
#include <string>
using namespace std;int main() {// 在对 Info 结构体进行声明时同时创建 info 及 test 结构体struct Info{string name;int age;}info, test;// 对未初始化的结构体进行访问cout << info.name << '\t' << info.age << endl;cout << test.name << '\t' << test.age << endl;system("pause");
}
执行结果
84200288
请按任意键继续. . .
声明及初始化
#include <iostream>
#include <string>
using namespace std;int main() {// 在对 Info 结构体进行声明时同时初始化 info 及 test 结构体struct Info{string name;int age;}info{"RedHeart",18}, test{"TwoMoons"};// 对未初始化的结构体进行访问cout << info.name << '\t' << info.age << endl;cout << test.name << '\t' << test.age << endl;system("pause");
}
执行结果
RedHeart 18
TwoMoons 0
请按任意键继续. . .
匿名结构体
你可以不用为定义的结构体类型赋予标记,但这将导致你在使用该结构类型创建结构体后无法再次使用该结构类型创建结构体。
举个栗子
#include <iostream>
#include <string>
using namespace std;int main() {// 声明并初始化结构体struct{string name;int age;}info{"RedHeart",18},test{"TwoMoons"};// 访问结构体中的变量cout << info.name << '\t' << info.age << endl;cout << test.name << '\t' << test.age << endl;system("pause");
}
执行结果
RedHeart 18
TwoMoons 0
请按任意键继续. . .
细节
外部声明与内部声明
在声明结构体时,你可以选择使用内部声明(即在函数内部对结构体进行声明)的方式对结构体进行声明,也可以选择使用外部声明(即在函数外部对结构体进行声明)的方式对结构体进行声明。
外部声明与内部声明的区别有:
- 通过外部声明的方式声明的结构体可以被多个函数所共享。在使用外部声明的方式声明结构体时,推荐将声明结构体的语句放置于所有函数之前,这样可以使得 C++ 中的所有函数都可以直接使用该结构体。
举个栗子
#include <iostream>
#include <string>
using namespace std;struct GlobalStruct{string name;int age;
};void func() {// 使用这部分语句将对 GlobalStruct 进行初始化GlobalStruct globalStruct{"RedHeart",19};// 访问结构体中的数据cout << "func()\t" << globalStruct.name << '\t' << globalStruct.age << endl;
}int main() {// 对 func() 函数进行调用func();// 使用这部分语句将对 GlobalStruct 进行初始化GlobalStruct globalStruct{"RedHeart",19};// 访问结构体中的数据cout << "main()\t" << globalStruct.name << '\t' << globalStruct.age << endl;system("pause");
}
执行结果
func() RedHeart 19
main() RedHeart 19
请按任意键继续. . .
注:
请不要在与结构体的外部声明的相关语句之前使用结构体,否者,C++ 将抛出错误。例如:
#include <iostream>
#include <string>
using namespace std;void func() {GlobalStruct globalStruct{"RedHeart",19};cout << "func()\t" << globalStruct.name << '\t' << globalStruct.age << endl;
}// 将结构体的外部声明语句移至此处
struct GlobalStruct{string name;int age;
};int main() {func();GlobalStruct globalStruct{"RedHeart",19};cout << "main()\t" << globalStruct.name << '\t' << globalStruct.age << endl;system("pause");
}
- 通过内部声明的方式声明的结构体仅能够被声明该结构体的函数所使用。
成员赋值
对于结构体来说,成员赋值即将属于同一结构类型(不同结构类型,C++ 将抛出错误)的两个结构体中的某一结构体的已初始化数据赋值给另一结构体。
举个栗子
#include <iostream>
#include <string>
using namespace std;int main() {struct Info{string name;int age;};Info info{"RedHeart",18};Info test;// test 结构体中的原数据(未初始化)cout << test.name << '\t' << test.age << endl;// 将 info 结构体中已初始化的变量赋值给 test 结构体中的相应变量test = info;// test 结构体中的数据已被初始化cout << test.name << '\t' << test.age << endl;system("pause");
}
执行结果
4200496
RedHeart 18
请按任意键继续. . .
注:
会被成员赋值操作所影响的变量仅为右值(可以简单理解为位于赋值语句中等号右边的内容)中已初始化的变量,未被初识化的变量不会参与到成员赋值过程。
举个栗子
#include <iostream>
#include <string>
using namespace std;int main() {struct Info{string name;int age;};// 创建结构体 info,此处不适用列表初始化方式// 初始化结构体的原因是,列表初始化方式默认将未// 被人为初始化的变量初识化为 0 Info info;// 为 info 结构体初始化其变量 nameinfo.name = "RedHeart";// 创建结构体 testInfo test;// test 结构体中的原数据(未初始化)cout << test.name << '\t' << test.age << endl;// 将 info 结构体中已初始化的变量赋值给 test 结构体中的相应变量test = info;// test 结构体中的数据已被初始化cout << test.name << '\t' << test.age << endl;system("pause");
}
执行结果
4200400
RedHeart 8
请按任意键继续. . .
共用体
共用体能够存储多种数据类型,但在某一时间仅能存储其中的一种数据类型。共用体的使用语法与结构体相似,在学习了结构体后相信你可以很快上手共用体。
举个栗子
#include <iostream>
using namespace std;int main() {// 声明共用体union Content{int integer;char character;}; // 注意此处的分号,若缺失,C++ 将抛出错误。// 创建共用体union Content content;// 使用共用体存储字符串content.character = 'R';cout << content.character << endl;// 使用共用体存储整型数据content.integer = 100;cout << content.integer << endl;system("pause");
}
执行结果
R
100
请按任意键继续. . .
注:
- 创建共用体时,union 关键字可以省略。
- 在共用体使用另一种数据类型存储时,原数据类型将恢复至未初始化状态。
举个栗子
#include <iostream>
using namespace std;int main() {union Content{int integer;char character;};union Content content;content.character = 'R';cout << content.character << endl;content.integer = 100;cout << content.integer << endl;// 使用 integer 存储数据后,向执行窗口输出// character 保存的内容。cout << content.character << endl;system("pause");
}
执行结果
R
100
d
请按任意键继续. . .
存储空间
共用体的用途之一是,当数据项使用两种或更多种格式(数据类型),但不会同时使用时,可有效的减少所需要的存储空间。
共用体的长度仅为其存储的多种数据类型中,占用内存空间最大的那一数据类型的长度。
举个栗子
#include <iostream>
using namespace std;int main() {union Content{int integer;char character;};union Content content;// 由于 Content 共用体中占用内存空间最多的// 数据类型为 int,故该语句将打印数据类型// int 所占用的内存空间(字节),即 4cout << sizeof(Content) << endl;system("pause");
}
执行结果
4
请按任意键继续. . .
匿名共用体
匿名共用体即没有名称的共用体,你可以像匿名结构体那般在声明时同时创建一个匿名共用体。
举个栗子
#include <iostream>
using namespace std;int main() {// 声明并创建一个匿名共用体union{int age;char symbol;}content;content.age = 18;cout << content.age << endl;content.symbol = 'R';cout << content.symbol << endl;system("pause");
}
执行结果
18
R
请按任意键继续. . .
同化
你若在一个结构体中声明一个匿名共用体,那么这个匿名共用体中的变量将被同化为匿名共用体所在的结构体中的变量。
举个栗子
#include <iostream>
using namespace std;int main() {struct{union {int age;char symbol;};}info;info.age = 18;cout << info.age << endl;info.symbol = 'R';cout << info.symbol << endl;system("pause");
}
执行效果
18
R
请按任意键继续. . .
尾声
💔存在问题💔 无法实现在共用体中存储字符串类型数据,正在探索中。
💕欢迎建议💕 如果你对这篇博客右什么意见,欢迎提出。
💞欢迎提问💞 如果各位对文章中的某些内容不太理解,欢迎提问。
相关文章:
C++ 之结构体与共用体
文章目录参考描述结构体使用(基本)声明初始化先创建后初始化C 11 列表初始化使用(进阶)结构数组声明(拓展)声明及创建声明及初始化匿名结构体细节外部声明与内部声明成员赋值共用体存储空间匿名共用体同化尾…...
Java基础知识汇总(良心总结)
1. 前言 本文章是对Java基础知识进行了汇总,方便大家学习。 申明:文章的内容均来自黑马程序员,博主只是将其搬到了CSDN上以共享给大家学习 2. 目录 Day01 Java学习笔记之《开章》 Day02 Java学习笔记之《运算符》 Day03 Java学习笔记之《流程…...
InnoDB之Undo log格式
1. 前言 InnoDB有两大日志模块,分别是redo log和undo log。为了避免磁盘随机写,InnoDB设计了redo log,数据写入时只写缓冲页和redo log,脏页由后台线程异步刷盘,哪怕系统崩溃也能根据redo log恢复数据。但是我们漏了一…...
一问学习StreamAPI终端操作
Java Stream管道流是用于简化集合类元素处理的java API。 在使用的过程中分为三个阶段: 将集合、数组、或行文本文件转换为java Stream管道流管道流式数据处理操作,处理管道中的每一个元素。上一个管道中的输出元素作为下一个管道的输入元素。管道流结果…...
在屎山代码中快速找到想要的代码法-锁表法(C#)
由于本人水平有限,文中有写得不对的地方请指正,本文的方法有些投机取巧,实在是没招的情况下可以酌情使用,如有侵权,请联系删除。 前几天接到一个需求,要在医嘱签署时对检验项目进行分方操作,分…...
网页设计html期末大作业
网页设计html期末大作业网页设计期末大作业-自制网站大一期末作业,外卖网站设计网页设计期末大作业-精美商城-首页框架网页设计期末大作业-自制网站 有导航栏,轮播图,按钮均可点进去,如下图所示 点我下载资源》》》》 大一期末…...
实战打靶集锦-006-Stapler
**写在前面:**记录博主的一次打靶经历。 目录1. 主机发现2. 端口发现3. 服务枚举4. 服务探查4.1 FTP探查4.1.1 匿名登录4.1.2 Elly用户4.1.3 John用户4.1.4 EXP搜索4.2 dnsmasq探查4.2.1 基础信息获取4.2.2 EXP搜索4.3 WEB应用探查4.3.1 浏览器访问4.3.2 目录扫描4.…...
致远OAA6版安装
准备工作,操作系统winserver2019,sqlserver2019。致远OA安装包0.SeeyonInstall.zip相关下载:winserver2019下载地址:cn_windows_server_2019_updated_july_2020_x64_dvd_2c9b67da.iso magnet:?xturn:btih:22A410DEA1B0886354A34D…...
python实用脚本(六)—— pandas库的使用(生成、读取表格)
本期主题: python的pandas使用 往期链接: python实用脚本(一)—— 批量修改目标文件夹下的文件名python实用脚本(二)—— 使用xlrd读取excelpython实用脚本(三)—— 通过有道智云AP…...
字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题等
编码解码一、背景二、字符的相关概念三、字符集3.1 ASCII[ˈski]3.1.1 ASCII的编码方式3.1.2 EASCII3.2 GBK3.2.1 GB 2312-803.2.2 GBK的制订3.2.3 GBK的实现方式3.3 Unicode(统一码、万国码)3.3.1 Unicode的出现背景3.3.2 Unicode的编写方式3.3.3 Unico…...
Java 布隆过滤器
你在么?在!一定在么?不在!一定不在么? 你想要100%的准去性,还是99%的准确性附带较高的速度和较小的资源消耗。 任何算法,任何经营收到的背后,都是时间效益 资源消耗 准确性的平衡&am…...
vscode连接服务器(腾讯云)
文章目录1. vscode远程总是报错2. vscode能连上腾讯云但密码不对或者登录后不能打开文件或文件夹1. vscode远程总是报错 报错如图所示 Could not establish connection to *** 过程试图写入的管道不存在。 在百度、csdn找了好久都是说删掉.ssh文件下的某个文件但我压根没有&a…...
IOS崩溃文件符号化实践
1.背景与项目难点 1.1 背景 由于公司之前使用的友盟要收费,filebase服务由谷歌提供,存在数据合规风险。需要实现稳定性分析功能,通过支持app崩溃信息实时采集、实时上报、实时自动解析并定位出代码问题,帮助研发同学及时定位崩溃…...
设计模式之适配器模式与桥接模式详解和应用
目录1 适配器模式1.1 定义1.2 应用场景1.3 适配器角色1.4 类适配器1.5 对象适配器1.5 接口适配器1.6 实战1.7 源码1.8 适配器与装饰器的对比1.9 适配器模式的优缺点1.10 总结2 桥接模式2.1 原理解析2.2 角色2.3 通用写法2.4 应用场景2.5 业务场景中的运用2.6 源码2.7 桥接模式优…...
Winform控件开发(14)——NotifyIcon(史上最全)
前言: 先看个气泡提示框的效果: 代码如下: 在一个button中注册click事件,当我们点击button1时,就能显示气泡 private void button1_Click(object sender, EventArgs e){notifyIcon1.Visible = true;notifyIcon1...
Verilog 学习第四节(从计数器到可控制线性序列机——LED实验进化六部曲)
从计数器到可控制线性序列机——LED实验进化六部曲一:让LED灯按照亮0.25s,灭0.75s的状态循环亮灭二:让LED灯按照亮0.25s,灭0.5s,亮0.75s,灭1s的状态循环亮灭三:让LED灯按照指定的亮灭模式亮灭&a…...
操作SSH无密登录配置
例如小编有三台服务器需要相互访问,就需要配置三台,这三台分别是hadoop102,hadoop103 , hadoop1041.打开三个服务器,分别生成hadoop102,hadoop103 , hadoop104的公钥和私钥输入命令,然后一直回车,这时候什么…...
Websocket详细介绍
需求背景 在某个资产平台,在不了解需求的情况下,我突然接到了一个任务,让我做某个页面窗口的即时通讯,想到了用websocket技术,我从来没用过,被迫接受了这个任务,我带着浓烈的兴趣,就…...
大数据书单(100本)
大数据书单(100本) 序号 书名 作者 出版社 1 Hadoop权威指南:大数据的存储与分析(第4版)(修订版)(升级版) Tom White 清华大学出版社 2 Hive编程指南 卡普廖洛 (Edward Capriolo) / 万普勒 (Dean Wampler) / 卢森格林 (Jason Rutherglen) / 曹坤 人民邮…...
python实战应用讲解-【语法基础篇】初识Python(附示例代码)
目录 前言 Python基础 基本概念: 为什么使用Python? Python2.x与3.x版本区别...
【2023保研夏令营】网安、CS(西交、华师、科、南等)
文章目录一、基本情况二、投递和入营情况三、考核情况1. 西交软院(面试)2. 川大网安(笔试面试)3. 华东师范数据学院(机试面试)4. 人大信息学院专硕(机试面试,保密)5. 南大…...
Qt COM组件导出源文件
文章目录摘要dumpcpp.exe注册COM组件COM 组件转CPP参考关键字: Qt、 COM、 组件、 源文件、 dumpcpp摘要 由于厂家提供的库不是纯净C库,是基于COM组件开的库,在和厂家友好交流无果下,只能研究下Qt 如何调用,好在Qt 的…...
各数据库数据类型的介绍和匹配
各数据库数据类型的介绍和匹配1. Oracle的数据类型2. Mysql的数据类型3. Sql server的数据类型4. 类型匹配5. Awakening1. Oracle的数据类型 数据类型介绍 VARCHAR2 :可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749; NCHAR :根据字符集而定的固定长度字…...
Rancher 部署 MySQL
文章目录创建 pvc部署 MySQL前置条件:安装 rancher,可参考文章 docker 部署 rancher 创建 pvc MySQL 数据库是需要存储的,所以必须先准备 pvc 创建 pvc 自定义 pvc 名称选择已经新建好的 storageclass,storageclass 的创建可参考…...
Python语言零基础入门教程(二十五)
Python OS 文件/目录方法 Python语言零基础入门教程(二十四) 39、Python os.openpty() 方法 概述 os.openpty() 方法用于打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 语法 openpty()方法语法格式如下: os.openpty()参数 无 返…...
蓝桥杯算法训练合集十五 1.打翻的闹钟2.智斗锅鸡3.文件列表
目录 1.打翻的闹钟 2.智斗锅鸡 3.文件列表 1.打翻的闹钟 问题描述 冯迭伊曼晚上刷吉米多维奇刷的太勤奋了,几乎天天迟到。崔神为了让VonDieEman改掉迟到的坏毛病,给他买了个闹钟。 一天早上,老冯被闹钟吵醒,他随手将闹钟按掉丢…...
CPU扫盲-CPU与指令集
指令集架构就像是特定的CPU的设计图纸,它规定了这个CPU需要支持那些指令、寄存器有那些状态以及输入输出模型。根据指令集结构的设计,在CPU上通过硬件电路进行实现,就得到了支持该指令集的CPU。指令集就像是我们编程语言中的接口,…...
VINS-Mono/Fusion与OpenCV去畸变对比
VINS中没有直接使用opencv的去畸变函数,而是自己编写了迭代函数完成去畸变操作,主要是为了加快去畸变计算速度 本文对二者的结果精度和耗时进行了对比 VINS-Mono/Fusion与OpenCV去畸变对比1 去畸变原理2 代码实现2.1 OpenCV去畸变2.2 VINS去畸变3 二者对…...
jmx prometheus引起的一次cpu飙高
用户接入了jmx agent进行prometheus监控后,在某个时间点出现cpu飙高 排查思路: 1、top,找到java进程ID 2、top -Hp 进程ID,找到java进程下占用高CPU的线程ID 3、jstack 进程ID,找到那个高CPU的线程ID的堆栈。 4、分析堆…...
Android 虚拟 A/B 详解(六) SnapshotManager 之状态数据
本文为洛奇看世界(guyongqiangx)原创,转载请注明出处。 原文链接:https://blog.csdn.net/guyongqiangx/article/details/129094203 Android 虚拟 A/B 分区《AAndroid 虚拟 A/B 分区》系列,更新中,文章列表: Android 虚拟分区详解(一) 参考资料推荐Android 虚拟分区详解(二…...
万网域名注册网站/怎么自己弄一个网站
1、$(document).ready(function(){})dom加载完成后触发window.onload只能注册一个方法页面所有内容加载完成后触发(图片,css,js都加缩写$(function(){})2、jQuery对象(包装集) dom对象var div document.getElementById("id") dom对…...
建设电商网站/高端企业建站公司
linux shell命令下我们可以通过相关命令关闭和重启计算机,下面由学习啦小编为大家搜集整理了linux shell的关机命令是什么的相关知识,希望对大家有帮助!linux shell的关机命令问题描述对于Linux系统而言,许多时候是用于服务器之类的ÿ…...
西安网站建设首选/优化系统的软件
原标题:「数控干货」基于UG CLS文件使用 C 语言制作智能后处理工具1 前言UG 后处理操作是 UGCAM 数控加工工作中一个重要环节,主要任务是把在 UG 加工环境下生成的加工刀位文件转换成机床可接受的数控代码文件。UG 本身提供了强大的 Post Builder 后处理…...
jquery 网站模板/关联词有哪些类型
前言 **一年中第一段跳槽高潮就要来了,**看到同事一个个离职,又有一部分同事已经找到满意的工作,于是自己也盲目的开始面试起来(期间也没有准备充分),日夜奔走,简历投了很多家公司,…...
wordpress图片清理/成都网络推广外包公司哪家好
在前阵子项目改造中,需要利用先前的S7-200 PLC与ifix进行通讯,故而,在做好上位机后,在现场实际测试了下。通过CP243-1以太网模块,顺利与KEPWARE建立连接,其中当然也有些要点要注意: 1.在kepware…...
泉州网站设计/搜索引擎营销特点是什么
目录 0. 相关文章链接 1. Elasticsearch简介 2. 应用场景 3. 工程化案例 4. 用户画像标签数据存储总结 注:此博文为根据 赵宏田 老师的 用户画像方法论与工程化解决方案 一书读后笔记而来,仅供学习使用 0. 相关文章链接 用户画像文章汇总 1. Ela…...