自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AndyJ的学习之旅

一个人工智能小白的进修历程

  • 博客(303)
  • 收藏
  • 关注

原创 STL容器适配器之priority_queue

参考链接priority_queue 容器priority_queue 容器适配器模拟的也是队列这种存储结构,即使用此容器适配器存储元素只能“从一端进(称为队尾),从另一端出(称为队头)”,且每次只能访问 priority_queue 中位于队头的元素。但是,priority_queue 容器适配器中元素的存和取,遵循的并不是 “First in,First out”(先入先出)原则,而是“First in,Largest out”原则。直白的翻译,指的就是先进队列的元素并不一定先出队列,而是优先级最

2021-05-07 16:47:14 314

原创 STL容器适配器之queue

参考链接queue 容器和 stack 栈容器适配器不同,queue 容器适配器有 2 个开口,其中一个开口专门用来输入数据,另一个专门用来输出数据。最先进入 queue 的元素,也可以最先从 queue 中出来,即用此容器适配器存储数据具有“先进先出(简称 “FIFO” )”的特点,因此 queue 又称为队列适配器。queue容器适配器的创建queue 容器适配器以模板类 queue<T,Container=deque<T>>(其中 T 为存储元素的类型,Contai

2021-05-07 16:37:04 344

原创 STL容器适配器之stack

参考链接stack 栈适配器stack 栈适配器是一种单端开口的容器(如图 1 所示),实际上该容器模拟的就是栈存储结构,即无论是向里存数据还是从中取数据,都只能从这一个开口实现操作。stack 适配器的开头端通常称为栈顶。由于数据的存和取只能从栈顶处进行操作,因此对于存取数据,stack 适配器有这样的特性,即每次只能访问适配器中位于最顶端的元素,也只有移除 stack 顶部的元素之后,才能访问位于栈中的元素。stack容器适配器的创建stack 适配器以模板类 stack<T,Cont

2021-05-07 16:26:21 311

原创 STL容器适配器概述

参考链接容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。stack<T>:是一个封装了 deque<T> 容器的适配器类模板,默认实现的是一个后入先出(Last-In-First-Out,LIFO)的压入栈。stack<T>模板定义在头文件 stack 中。queue<T>:是一个封装了 deque<T>容器的适配器类模板,默认实现的

2021-05-07 16:18:12 189

原创 STL无序容器之unordered_set和unordered_multiset

参考链接unordered_setunordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。unordered_set 容器具有以下几个特性:不再以键值对的形式存储数据,而是直接存储数据的值;容器内部存储的各个元素的值都互不相等,且不能被修改。不会对内部存储的数据进行排序(这和该容器底层采用哈希表结构存储数据有关)实现 unordered_set 容器的模板类定义在<unordered_s

2021-05-07 16:03:33 1540

原创 STL无序容器之unordered_map和unordered_multimap

参考链接map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。unordered_map 容器在<unordered_map>头文件中,并位于 std 命名空间中。参数含义<key,T>前 2 个参数分别用于确定键值对中键和值的类型,也就是存储键值对的类型。Hash = hash用于指明容器在存储各个键值对时要使用的哈希函数,默认使用 STL 标准库提供的 hash 哈希函数。注意,默认哈希函数只适用于基本数据类型(包括

2021-05-07 15:51:37 867

原创 STL无序容器概述

无序关联式容器无序关联式容器,又称哈希容器。和关联式容器一样,此类容器存储的也是键值对元素;不同之处在于,关联式容器默认情况下会对存储的元素做升序排序,而无序关联式容器不会。无序关联式容器擅长通过指定键查找对应的值,而遍历容器中存储元素的效率不如关联式容器。关联式容器的底层实现采用的树存储结构,更确切的说是红黑树结构;无序容器的底层实现采用的是哈希表的存储结构。C++ STL 底层采用哈希表实现无序容器时,会将所有数据存储到一整块连续的内存空间中,并且当数据存储位置发生冲突时,解决方法选用的是

2021-05-07 15:00:43 167

原创 STL关联容器详解之set

set 容器使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。基于 set 容器的这种特性,当使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值(也就是 key 的值)即可。使用 set 容器存储的各个元素的值必须各不相同。切勿尝试直接修改 set 容器中已存储元素的值,这很有可能破坏 set 容器中元素的有序性,最正确的修改 set 容器中元素值的做法是:先删除该元素,然后再添加一个修改后的元素。set 容器定义于<set>头文件,

2021-05-06 17:36:48 383

原创 STL关联容器详解之map

map容器map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。通常情况下,map 容器中存储的各个键值对都选用 string 字符串作为键的类型。在使用 map 容器存储多个键值对时,该容器会自动根据各键值对的键的大小,按照既定的规则进行排序。默认情况下,map 容器选用std::less<T>排序规则(其中 T 表示键的数据类型),其

2021-05-06 16:48:04 135

原创 STL关联式容器概述

关联式容器关联式容器在存储元素值的同时,会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C++ 基础数据类型或自定义类型的元素),它的功能是在使用关联式容器的过程中,如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。使用关联式容器存储的元素,都是一个一个的“键值对”( <key,value> ),这是和序列式容器最大的不同。除此之外,序列式容器中存储的元素默认都是未经过排序的,而使用关联式容器存储的元素,默认会根据各元素的键值的大小做升序排

2021-05-06 15:28:17 166

原创 STL序列容器详解之list

参考链接list 容器又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。list 容器中各个元素的前后顺序是靠指针来维系的,每个元素都配备了 2 个指针,分别指向它的前一个元素和后一个元素。其中第一个元素的前向指针总为 null,因为它前面没有元素;同样,尾部元素的后向指针也总为 null。list 容器可以在序列已知的任何位置快速插入或删除元素(时间复杂度为O(1))。并且在 list 容器

2021-04-29 16:29:56 175

原创 STL序列容器详解之deque

双端队列容器deque 是 double-ended queue 的缩写,又称双端队列容器。deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。deque 容器也可以根据需要修改自身的容量和大小。deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1)。deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。deque 容器以模板类 deque<T>(T 为存储元素的类型)的形式在 <d

2021-04-29 15:57:36 291

原创 STL序列容器详解之vector

参考链接vector 容器vector 容器是 STL 中最常用的容器之一。vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。vector 容器以类模板 vector<T>(

2021-04-29 11:38:01 148

原创 STL序列容器详解之Array

参考链接array 容器array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。和其它容器不同,array 容器的大小是固定的,无法动态的扩展或收缩,这也就意味着,在使用该容器的过程无法借由增加或移除元素而改变其大小,它只允许访问或者替换存储的元素。array 容器以类模板的形式定义在 <array> 头文件,并位于命名空间 std 中#include <array>using namespac

2021-04-29 10:16:54 253

原创 STL序列式容器概述

序列容器大致包含以下几类容器:array<T,N>(数组容器):表示可以存储 N 个 T 类型的元素,是 C++ 本身提供的一种容器。此类容器一旦建立,其长度就是固定不变的,这意味着不能增加或删除元素,只能改变某个元素的值;vector<T>(向量容器):用来存放 T 类型的元素,是一个长度可变的序列容器,即在存储空间不足时,会自动申请更多的内存。使用此容器,在尾部增加或删除元素的效率最高(时间复杂度为 O(1) 常数阶),在其它位置插入或删除元素效率较差(时间复杂度为 O(n

2021-04-28 16:41:24 131

原创 C++高阶-多线程开发thread

为了简化多线程程序的设计与实现, C++11的标准库专门提供了<thread>头文件以支持多线程程序的开发。利用thread创建线程C++11 中的<thread>头文件提供了 thread、 mutex 以及 unique_lock 等基本对象来对多线程开发中最常用的线程、互斥以及锁等基本概念进行抽象与表达,为多线程程序的实现提供了一个较低抽象层次的编程模型。线程是对程序中的某个执行或者计算过程的一种表述,而所谓的多线程程序,就是将原来的一个执行过程分成多个过程去执行。由此可

2021-04-23 10:34:09 246

原创 C++高阶-智能指针shared_ptr

智能指针shared_ptr 能够知道它所指向的内存资源还有没有人在使用?从而可以在没人使用的情况下自动释放这块内存资源。引用计数shared_ptr 对它所指向的内存资源的管理使用引用计数。当新增一个 shared_ptr 对该资源进行管理时,也就是新增一个指向此资源的 shared_ptr 时,它就会将该内存资源的引用计数加 1;反之,当减少一个 shared_ptr 对该资源进行管理时,就会将该内存资源的引用计数减 1;如果该内存资源的引用计数变为 0,则说明没有任何指针对其进行管理,就

2021-04-23 09:43:50 952

原创 C++高阶之内存管理问题

C++中的内存管理例如:在 C++语言中,可以使用 new 操作符灵活自由地申请特定大小的内存资源供程序使用,同时又可以利用指向这些内存资源的指针方便地在函数间进行传递,在提高程序性能的同时也增加了程序的灵活性。#include <iostream>#include <fstream>using namespace std;// 将指针所指向的内存位置上的数据写入文件bool WriteToFile(const int* pScore,const unsigned in

2021-04-22 14:32:02 367

原创 C++高阶之右值引用

右值引用在 C++语言中,按照能否放在赋值操作符“=”的左边或者右边,数值或变量被分成左值或者右值。比如某个数字常量,就只能放在等号右边给其它左值赋值而无法放在等号左边被赋值。 C++中的右值主要指的是数字常量(例如, 1、 2.3 等)和匿名变量(例如,函数的返回值变量、构造函数的返回的对象等)。定义右值引用就是与这些右值相关联的引用。在 C++中,可以通过将“&&”符号放到数据类型的后面来定义一个相应类型的右值引用,相对应地,原来只使用一个“&”符号定义的引用被称为左值引

2021-04-22 11:18:07 175

原创 C++高阶-STL实战之工资设计优化

工资设计优化用 STL中的容器和算法对原来的工资设计 程序进行改写,原程序中对于数据的保存和处理主要是在 SalarySys 类中进行,所以对于程序的改写也主要就是对于 SalarySys 类的改写。针对原程序中存在的问题:首先,用可以动态改变大小的 vector 容器来保存那些会动态增减的员工数据。这样,容器的大小会随着数据的增减而动态变化, 不至于浪费内存资源,也不会出现空间不够的情况。同时, vector 容器提供了丰富的成员函数,让我们对数据的访问既便捷又安全。其次,用 STL 中的 fi

2021-04-22 10:27:37 135

原创 C++高阶-lambda表达式

Lambda 表达式在 C++中,我们用 Lambda 表达式来表达匿名函数。所谓匿名函数,就是这个函数只有函数体、参数和返回值类型,而没有函数名。在作用上, Lambda表达式跟函数指针和函数对象相同,它同样可以方便地应用于 STL 算法中,对算法进行自定义。在使用上, Lambda 表达式可以在使用函数的地方对其进行定义,使整个代码更加自然流畅。更方便的是,可以在 Lambda 表达式中直接访问 Lambda 表达式之外的数据,这样就避免了复杂的参数传递,也解决了函数执行过程中状态数据的保存问

2021-04-22 09:39:43 315

原创 C++高阶之函数对象

定义函数调用操作符函数对象的定义跟函数的定义一样简单。首先,需要定义一个普通的类并定义它的函数调用操作符“operator()”。在函数调用操作符中,可以对数据进行处理,实现函数的所有功能。同时,因为类具有成员变量,可以将每次函数执行的状态数据保存到它的成员变量中,而在下次执行的时候可以访问这个成员变量从而得到上一次执行时的状态数据。// 函数对象的类模板template <typename T>class mymax{ public: // 重载"()"操作符,在这个操作符中实

2021-04-21 16:34:07 163

原创 C++高阶之函数指针

函数指针的定义、赋值与使用概念跟指向数据的普通指针一样,函数指针本质上也是一个变量,它记录的也是表示某个内存地址的整数数值。只不过这个内存地址上保存的不是普通数据而是某个函数的代码,所以这个指针就成了指向这个函数的函数指针。如果某个函数指针的值是某个函数的入口地址,则说这个函数指针指向这个函数。进而,我们可以通过这个函数指针调用它所指向的函数,就如同我们通过指向普通变量的指针访问它所指向的变量一样。定义定义一个函数指针的语法形式如下:函数返回值类型标志符 (*指针变量名)(形式参数列表);函

2021-04-21 15:51:02 200

原创 C++高阶之实战STL

STL实战程序#include <vector>#include <algorithm>#include <string>#include <iostream>using namespace std;class Student{ public: Student() { m_nHeight = 0; m_strName = ""; };

2021-04-21 15:13:12 143

原创 C++高阶-STL之容器元素的排序

sort()算法template <class RandomAccessIterator>void sort ( RandomAccessIterator first, RandomAccessIterator last );sort()算法可以接受两个参数,分别用于指定需要进行排序的容器中数据的起始位置和结束位置。只要确定了排序的数据范围,默认情况下, sort()算法就会将数据元素按照从小到大的顺序排序,至于具体的排序和数据的移动,就无须我们操心了, sort()算法会处理好一切。

2021-04-21 14:45:21 517

原创 C++高阶-STL之容器元素的复制和变换

copy()算法copy()算法可以接受三个参数,前两个参数表示需要复制的源容器的起始位置和终止位置,它们共同定义了需要复制的数据元素的范围。第三个参数则是目标容器的起始位置。copy()算法将前两个参数所表示的源容器范围内的数据,复制到第三个参数表示的目标容器的开始位置并依次往后。复制完成后, copy()算法会返回指向目标容器中被复制元素的结束位置,也就是最后一个元素的下一个位置。要保证在目标容器的复制开始位置之后有足够的空间来容纳即将被复制进来的数据。必要的时候,可以根据被复制数据的多少,使用

2021-04-21 10:15:08 1385

原创 C++高阶-STL之容器元素的查找与遍历

用 for_each()算法遍历容器中的数据元素for_each()算法的意义,不仅仅是遍历容器中的每一个数据元素,更重要的意义在于,它在遍历容器中的每一个数据元素的同时,可以将某个操作应用到它访问的每一个数据元素上,从而直接实现对容器中大量元素的处理。同时,这个操作是可替换的,这就增加了处理数据的灵活性。Function for_each (InputIterator first, InputIterator last, Function f);for_each()算法可以接受三个参数,前两个通常

2021-04-20 17:01:14 2317

原创 C++高阶-用STL中的通用算法处理数据

STL 提供了大量的通用算法,利用这些算法可以轻松完成对数据的常见处理,比如数据的查找、排序和遍历访问等。因此在大多数情况下,当我们需要某个常见算法对数据进行处理的时候,直接使用 STL 提供的算法就可以了,无需自己开发,从而可以极大地提高我们的开发效率。同时,无论是这些算法的效率还是实现质量,往往都要比我们自己动手实现的相同算法要高,这无疑会提高我们的开发质量。STL 算法中的“四大帮派”STL 库中的算法都以迭代器为参数,这就使得算法和数据所在容器的具体实现相互分离了。同样一个 sort()排序算法

2021-04-20 15:36:49 166

原创 C++高阶-STL之map容器

创建并初始化 map 容器map 是 STL 中的一种关联容器,它提供了一种对{键,值}数据对进行保存和管理的能力。这种数据对是一对一成对出现的。在 map 容器的内部,它是使用一棵红黑树实现的—— 一种非严格意义上的平衡二叉树,因为这棵树具有对数据自动排序的功能,所以 map 容器内部所有的数据都是有序的。正是这种特性,使得 map 容器在增加和删除节点时对迭代器的影响很小,除了被操作的当前操作节点外,对其他的节点都没有什么太大影响。因此 map 容器特别适用于保存和管理那些增加和删除操作比较多的大量

2021-04-20 15:26:41 158

原创 C++高阶-STL之vector容器

vector 容器是数组的最佳替代者vector 容器同样可以用于保存和管理大量同类型数据,但无论是在内存管理上还是在对数据元素的访问上,都要优于数组:vector 容器动态增减的容量大小替代了数组的固定容量,可以适应各种不同的需要;通过 vector 容器提供的功能函数操作数据元素替代了数组通过“[]”对数据元素的直接操作,不仅更加安全,同时还提供了更丰富的操作。因此 vector 容器也成为了数组的最佳替代者,是我们最为常用的 STL 容器。创建并初始化 vector 对象vector 容器

2021-04-20 14:57:04 320

原创 C++高阶-用 STL 中的容器管理数据

容器容器,简单来讲,就是能够保存某种类型数据的类。按照组织数据的方式不同, STL 中的容器分为顺序容器( sequence container)和关联容器( associative container)两种。顺序容器顺序容器将数据组织成有限线性集合,所有数据都是同一类型的,就象一根绳子上拴着的多只蚂蚱。 STL 中包括三种基本顺序容器:向量( vector)、线性表( list)和双向队列( deque)。基于这三种基本顺序容器,又可以构造出一些专门的容器,用于表达一些比较特殊的数据结构,包括堆(

2021-04-19 17:17:47 242

原创 C++高阶-STL-用模板实现通用算法

函数模板函数模板,它以一个或者多个数据类型作为参数,因此它可以用来处理各种类型的数据。当编译器发现一个函数模板的调用后,它将根据函数模板的类型参数自动生成一个此种类型的重载函数,称该重载函数为模板函数。根据参数类型的不同,一个函数模板可以随时变成各种不同的重载函数,从而实现对各种数据类型的处理,达到一个函数模板应对万千数据类型的效果。函数模板可以用来创建一个通用功能的函数,以支持各种不同的数据类型,简化重载函数的设计。函数模板的定义非常简单,其语法格式如下:template <typename

2021-04-19 15:13:34 196

原创 C++高阶-初识STL

STL概念算法 + 容器 + 迭代器 = STL(Standard Template Library)STL,即标准模板库,是一个具有工业强度的、高效的 C++函数库。STL 主要分成三大核心部分:算法( algorithm)、容器( container)和迭代器( iterator)。除此之外还有容器适配器( container adaptor)、函数对象( functor)等。几乎 STL 的所有代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。容

2021-04-19 15:13:16 190

原创 C++进阶-const关键字

const如果想保护某个变量的值,使之保存的数据不被修改,可在定义这个变量的时候,在数据类型前加上 const 关键字进行修饰,语法如下:const 数据类型 变量名;例如:const double PI = 3.14159;PI = 3.14; // 想降低精度偷工减料?有 const 保护,这是行不通的const 修饰指针变量的两种形式int N = 0;const int* pInt1 = &N; // 第一种形式:常量整型指针int* const pInt2 = &am

2021-04-15 15:45:24 100

原创 C++进阶-typedef

用 typedef 给数据类型取个外号typedef 数据类型 数据类型的别名// 为无符号字符类型 unsigned char 定义一个别名 uchartypedef unsigned char uchar;有了这个简单的别名,就可以用它来指代无符号字符类型,用作数据类型定义变量:// 定义一个 uchar 类型的变量,实际上就是 unsigned char 类型的变量uchar a;typedef 是为复杂数据类型定义一个别名,而不只是像宏一样简单的替换。这一点在同时定义指针类型的多

2021-04-15 15:28:43 274

原创 C++进阶-宏定义

宏定义宏定义又称为宏替换,简称“宏”。在 C++世界中,使用“#define”指令来定义一个宏:无参数的宏#define 标识符 字符串其中,标识符就是所谓的符号常量,也称为“宏名”,其后的字符串可以是一个数字,也可以是一个字符串常量,甚至可以是一个复杂的表达式。当定义好宏之后,就可以在程序代码中使用这个宏来代替宏定义中的字符串。// 定义一个宏,表示圆周率#define PI 3.14159// 利用定义的宏计算圆的面积double fR = 5.0f;double fArea = P

2021-04-15 15:20:11 295

原创 C++进阶-编译预处理

编译预处理在源文件中引入头文件的“#include”指令,定义宏的“#define”指令等。这些指令所表达的其实是对源文件的某种处理。当一个源文件编写完成之后,在编译器对其进行编译之前,它还做了一些手脚。编译器会执行其中的这些指令并得到最终的源文件,然后才参与编译。这个过程被称为源文件的预处理过程,相应的,这些指令也被称为预编译指令。几种最常用的预编译指令。#include 指令#include 指令可以用来将一个文件嵌入( include)到当前位置,实现多个源文件共享同一个文件,共用其中的内容。

2021-04-15 15:15:10 83

原创 C++进阶-作用域与可见性

所谓作用域,就是某个标识符在程序中有效的区域范围。而可见性跟作用域就像是一个硬币的两面,它是从某个标识符“是否可用”的角度来描述作用域的。如果在某个标识符在某个作用域内是有效的、可以引用的,就说这个标识符在这个作用域内可见。换句话说,就是标识符只在其作用域内可见。作用域按照作用区域的大小,可以把作用域分为局部作用域和全局作用域。局部作用域在 C++中,用大括号“{}”括起来的代码范围属于一个局部作用域。作用域可以嵌套作用域,如果局部作用域中包含更小的子作用域,那么子作用域具有较高的优先级,也就是说,

2021-04-15 15:06:19 440

原创 C++进阶-名字空间

namespaceC++提供了名字空间( namespace)来规划和管理程序中的各种名字(函数名、变量名、类名)。而在开发实践中,常常根据不同的模块来定义不同的名字空间,这样各个模块内部的名字不会互相影响,名字空间起到了很好的模块包装的作用。不同名字空间内的同名函数、同名变量等可以同时存在,互不冲突。定义一个名字空间的语法格式如下:namespace 名字空间名{ // 名字空间内的声明和定义};// 名字空间 Zhangsannamespace Zhangsan{ // 名字空间

2021-04-15 14:57:13 79

原创 C++进阶-源文件和头文件

将实现同一模块的代码放到同一个源文件,而将相应的声明放到对应的头文件中。源文件源文件以“.cpp”等为文件后缀名,它主要用于实现程序的各种功能单元。比如,可以将程序划分为多个子模块,而一个源文件负责实现一个子模块;或者是一个程序由多个类构成,而一个源文件负责实现一个类。头文件头文件以“.h”等为文件后缀名,主要包含一些需要在多个源文件之间共用的函数、数据、类等的声明。因为头文件可以被多个源文件使用#include 预编译指令引用,所以可以在多个源文件内共享这些声明,以达到共用的目的。比如,前面的例子

2021-04-15 14:40:55 1125

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除