第二周C++学习的记录

102 阅读5分钟

很幸运我能够在这一周将语法的部分学完,先恭喜我自己,从一个编程小白到如今对语言的初步了解,撒花!撒花!

QQ截图20240804095658.png

接下来就是对于这一周学习的总结:

学习指针、类、结构体

指针对我来说,先前已经接触过一点,但是没有涉及它的本质。现在学完了,忽然觉得指针是一个神奇的东西,可以说是“指哪打哪”。当然了,在一周前,刚开始接触指针时,会觉得很难。

第一次真正接触是在网课上y总讲课的时候,他说这个东西很简单,学了之后感觉指针就像是看天书一样。特别是"->" 这个东西,我当时很是费解,它是如何做到是如此抽象,又如此形象的。本来是定了在八月一号之前把语法全部学完,就是因为指针,导致一直延误到了八月四号上午才全部学完。

以上是我对这一章最大的感受,接下来听我细细道来;

这一章最开始学的是类,根据y总,这个玩意是用来提高运行效率的,和接下来要说的结构体作用几乎一致。

如果让我来理解它,我认为这就像是一个框子,把我们需要用的变量、函数,都用这个框子框起来。在代码里,也就是定义一个变量,而这个变量是在这个类里的,这个变量可以使用这个类里的所有定义过的函数。以下是如何定义一个类,以及如何定义一个类中的变量:

class Person
{
    pubilc:// 用于公共空间,可以外部访问
    int x;
    int y;
};

int main()
{
    Person a;
    a.x = 100;
    
    return 0;
}

其中就是利用了a 来调出类中的x 。之后学了SLT,库函数,就发现类和结构体可以用来干很多事情,

结构体

结构体和类几乎一致,而结构体只是没有像类之中的public 的东西。其余的用法都一致。并且结构体中的变量都是公共的,也就是默认外部可以访问,

另外要讲的就是,结构体构造函数不需要写返回值的类型的,且需要用原结构体的名字。而类构造函数就需要加一个返回值类型,但是不需要和类的名字一样,如:

类:

class Person
{
    public:
    int age, height;
    int a(int _age)
    {
        age = _age;
        return age;
    }
};

结构体:


struct Person
{
    int age, height;
    
    Person (int _age, int _height)
    {
        age = _age;
        height = _height;
    }
};

接下来就是我们的主角:指针

指针在C++ 中是一个独特的存在,其他的语言中没有,学完了之后就会发现指针的神奇之处。

要讲指针就要先从它的定义方式开始讲起:

int a = 0;
int *p = a;

这样就做到了定义一个a 的指针,也就是存储a 的地址。当我们输出时,就会发现,p 是一个地址。当然了,我们还可以返回一个p 存下的一个值,如下:

cout << *p << endl;

指针也支持加减法运算,不过这个适用于对数组的指针。这不是我们今天的重点,重点是让我琢磨了一个晚上的,奇妙的next,其代码如下:

struct Node
{
    int val;
    Node* next;
    
    Node (_val) : val(_val), next(NULL) {}
};

短短的几行代码,却道出了指针的精髓之处。刚开始学的时候,最难得,最不理解的就是这一块。其代码得作用就是,将链表的每一个地方都有返回值(val),并且用next 将链表连接起来。

其中也发挥了指针的最大的作用:链表

如果说链表和next 是一根绳子,将所有没有相关性的变量都牵起来了, 那么指针就是这个牵绳子的人。如上文所说,指针做到了“指哪打哪”, 它将链表变得有可控性。

以下,可以用来遍历链表:

for(auto i = head; i; i->next)
    cout << i->val << " ";

以上,就讲完了最难学的指针、类和结构体。

接下来,学习STL、库函数和位运算

正如y总所说,都是一些背的事情,干货很多;

STL

STL是一个容器,我自己来说就是数组、字符串plus 版。

说实话,没什么好说的,至于学习经历就只是用笔记本,记了满满当当的六页纸,在这里就把它们列一下,至于其用法,讲起来太过于冗长,且干燥,没有像学习指针那样有意思,如下:

<vector>//数组plus 
<queue>//队列
<stack>//栈
<set>
<map>
<unordered_set>//不重复
<unordered_map>//不重复
<bitset>//0, 1 串

这些的语法,我只能说多练练,慢慢就熟了,无需刻意地去记(反正也记不住

有一个有意思的语法,见下:

struct Node
{
    int x;
    double y;
    string z;
}a[100];

int main()
{
    for (int i = 0; i < 100; i ++)
        cin >> a[i].x >> a[i].y >> a[i].z;
}

这个东西类似于二元数组,但是,是数组的超级加强版。x, y, z 分别可以代表整数、浮点数、字符串,而x, y, z 又都属于a[100]这一个大类的。

我愿称之为二次元口袋

库函数 algorithm

同样,也没有什么讲的,都是一些记的东西,如下:

reverse(a.begin(), a.end())//翻转
unique(a.begin(), a.end())//去重
random_shuffle(a.begin(), a.end())//随机值
sort(a.begin(), a.end())//排序
lower_bound()
upper_bound()

以下有两个小点:

用完unique ,删去无用的部分

vector<int> a;
a.erase(a.unique(a.begin(), a.end()) - a.end())

在结构体中的sort 排序

struct Rec
{
    int x, y;
    int a[100];
    
    bool operator< (cunst Rec &t)const
        {
            return x < t.x;
        }
}

int main()
{
    (省略)
    sort(a.begin(), a.end());
    
    return 0;
}

总结

这一次写了很多,比上一次多了不少。一个是因为,这一章的干货很多,有意思的也很多。二个是因为,对于C++ 理解的深入,感想也越来越多。

最后,学完了语法,只是刚刚入门,以后还有很长的路要走。在计算机这一个全新的领域上,我必须要付出更多的努力,去学习更广阔的知识。以至于达成我最终的人生目标,遇到对的人。

希望多年后,我依旧能够想起我的初衷,坚持的走下去。