首页 > 编程语言 >【C++数据结构】启航,打开新世界的大门!

【C++数据结构】启航,打开新世界的大门!

时间:2023-08-02 18:04:31浏览次数:34  
标签:链表 const 启航 可以 C++ char 数据结构

@TOC


一、学习数据结构的原因

学习数据结构对于计算机科学和软件开发非常重要,它提供了处理和组织数据的有效方法和技术。以下是几个学习数据结构的重要原因:

  1. 提高问题解决能力: 数据结构教会了我们如何选择和使用适当的数据结构来解决问题。了解各种数据结构的特性和性能可以帮助我们分析和解决各种算法和编程问题。通过学习数据结构,我们可以开发更高效、更优化的算法来解决现实世界中的各种挑战。
  2. 优化资源利用: 不同的数据结构具有不同的存储方式和操作特性。了解这些特性有助于我们选择最适合问题需求的数据结构,从而节省存储空间和提高运行效率。通过正确选择数据结构,我们可以降低算法的时间复杂度和空间复杂度,使程序更高效、更经济地利用计算资源。
  3. 扩展和重用性: 学习数据结构可以帮助我们构建可扩展和可重用的代码。通过合理地组织数据,我们可以建立通用的数据结构和算法库,以便在不同的项目中重复使用。这样可以节省开发时间,提高代码质量,并促进团队合作和代码维护。
  4. 面试和职业发展: 数据结构是计算机科学面试的重要领域之一。许多技术公司在面试中会测试候选人对数据结构的理解和应用能力。熟练掌握数据结构不仅有助于通过面试,还可以增加在职场中解决实际问题的能力,提高职业发展的机会。

现在来看一个生活中的例子 :说明学习数据结构的实际应用。假设你是一名物流公司的调度员,负责处理货物的配送。你需要跟踪每个货物的位置和目的地,并根据最佳路线进行调度。在这种情况下,你可以使用数据结构来帮助管理这些信息。

二、一个值得思考的问题

现代的编程语言已经都自带数据结构了,那学习数据结构还有意义吗。 比如我们现在使用的C++、Java、Python都有数据结构,C++代表就是STL然而,学习数据结构仍然具有重要的意义,因为:

1、深入理解底层原理: 学习数据结构可以帮助你深入了解数据的组织方式和运作原理。你可以学习不同的数据结构如链表、栈、队列、树和图等,了解它们的实现方式以及它们在内存中的存储结构。这种深入理解可以让你更好地利用和优化现有的数据结构,解决实际问题时能够选择最适合的数据结构。

2、算法优化和性能提升: 数据结构和算法是紧密相关的。通过学习数据结构,你可以了解不同数据结构在不同场景下的优势和劣势,从而选择最适合的数据结构来解决特定的问题。掌握数据结构可以帮助你设计和实现更高效的算法,提升程序的执行速度和性能。

3、解决复杂问题: 一些复杂的问题可能无法直接通过现有的数据结构和操作来解决。通过学习数据结构的原理和实现方式,你可以更好地理解问题的本质,并设计出符合问题要求的自定义数据结构。这种能力在处理大规模数据、优化算法和解决特定领域的问题时至关重要。

4、扩大职业发展机会: 掌握数据结构是成为一名优秀程序员的关键要素之一。许多面试过程涉及数据结构和算法相关的问题。如果你对数据结构有很好的理解和实践经验,将能够在面试中展示出你的技术能力,提高你的竞争力和职业发展机会。

总之,尽管现代编程语言提供了许多内置的数据结构,但学习数据结构仍然对于成为一名优秀的程序员至关重要。它可以帮助你提高编程技能,深入理解底层原理,优化算法性能,并解决复杂的问题。无论是个人发展还是职业发展,掌握数据结构都是值得投入时间和精力的重要学习领域

三、本专栏涉及到的知识/技术

面向对象技术

使用面向对象技术主要有下面的原因: 封装和抽象: 面向对象编程中的类和对象提供了封装和抽象的机制。利用这些机制,可以将数据结构的实现细节隐藏在类的内部,只暴露必要的接口给用户。这种封装和抽象的方式使得数据结构更容易被使用和维护,用户可以更加专注于数据结构的功能而不必关心其内部实现。

代码重用: 面向对象编程鼓励代码重用,通过继承和组合等机制,可以构建基于已有数据结构的新数据结构。例如,可以通过扩展现有的链表类来创建双向链表或循环链表等。这种代码重用的特性可以减少开发时间和代码量,并且使得数据结构的设计更具扩展性和灵活性。

多态性: C++支持多态性,使得可以通过基类的指针或引用来操作派生类的对象。这对于处理一组不同类型的数据结构非常有用,可以通过统一的接口实现对多个数据结构的操作和处理。例如,可以定义一个抽象的基类作为容器,然后派生出不同类型的数据结构,如数组、链表、栈等,通过多态性实现对它们的一致性操作。

运算符重载: C++允许对运算符进行重载,这在数据结构的操作中非常有用。通过重载运算符,可以使得对数据结构的操作和访问更加直观和方便。例如,可以重载"+“运算符来实现两个数组的合并,或者重载”[]"运算符来实现对链表节点的访问。

内存管理: C++提供了直接的内存管理能力,可以通过new和delete等操作符来手动管理对象的内存分配和释放。这对于数据结构的动态创建和销毁非常有用,例如在链表和树等数据结构中,可以根据需要动态地分配节点并在不使用时释放内存,从而节省内存空间。

总而言之,C++语言通过面向对象编程提供了封装、抽象、代码重用、多态性和运算符重载等特性,使得开发数据结构更加方便和高效。它允许开发人员通过类和对象来表示数据结构,隐藏内部实现细节,提供一致的接口,同时还具有灵活性和扩展性。因此,C++使用面向对象编程是一种更好的选择来开发数据结构。

模板技术

本数据结构是使用C++类模板来编写的 原因:类模板可以大大提高代码的灵活度。 我可以举下面这样的一个例子: 两数相加:

int add(int a,int b)
{
    return a+b;
}

如果我们没有使用模板技术,虽然也实现了功能,但是如果我想要他可以add两个doublechar这样的类型他就不好弄了。 这时,我们可以请出我们的好帮手template模板

我们就可以把代码改成如下形式了:

template<typename T>
T add(T a,T b)
{
    return a+b;
}

我们使用下列测试代码:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    cout << "add<int>(1,1045)=" << add<int>(1,1045) << endl;
    cout << "add<double>(77.88,78)=" << add<double>(77.88,78) << endl;
    cout << "add<char>('a',1)=" << add<char>('a',1) << endl;

    return a.exec();
}

运行之后效果如下:

【C++数据结构】启航,打开新世界的大门!_链表

这样操作之后,我们就可以复用我们的add函数,使他可以适用更多的场景了!

异常类技术

由于我们是需要写一个跨平台的数据结构,由于每个平台出错之后抛的异常都不是一样的,这就导致在不同平台可能会出现不同的结构,从而导致出现无法想象的后果!

简单的异常类: 首先我们先定义一个异常父类,两个子类,子类分别是下标IndexOutOf和内存不足NoEnoughMemoryException,他们都要继承父类,从而实现多态

class Exception
{
protected:
    const char *message;
    const char *location;

public:
    Exception(const char *m,const char *l)
    {
        message = strdup(m);
        location = strdup(l);
    }

    const char *Message()const
    {
        return message;
    }

    const char *Location()const
    {
        return location;
    }
};

class IndexOutOf:public Exception
{
public:
    IndexOutOf(const char *m,const char *l):Exception(m,l)
    {

    }
};

class NoEnoughMemoryException:public Exception
{
public:
    NoEnoughMemoryException(const char *m,const char *l):Exception(m,l)
    {

    }
};

定义一个宏用于便捷发送Exception

#define THROW_EXCEPTION(e, m) (throw e(m, __FILE__))

定义一个Myarr,用于演示IndexOutOf的状况:

//使用模板技术,模板1为类型,2为该数组元素个数
template <typename T,int N>
class Myarr
{
protected:
    T arr[N];
public:
    Myarr()
    {
        for(int i = 0;i<N;i++)
        {
            arr[i] = 0;
        }
    }
	
	/*实现下标操作符,用于访问数组arr*/
    T& operator [](int index)
    {
        if(index >= N || 0 > index)
        {
            THROW_EXCEPTION(IndexOutOf,"class Arr operator [] Index Out of...");
        }
        else
        {
            return arr[index];
        }
    }
};

主函数如下:

Myarr<int,10> arr;
    try
    {
        arr[9];
        cout << "i don`t have Exception!" << endl;
    }
    catch(const Exception &e)
    {
        cout << e.Message() << " " << e.Location() << endl;
    }

arr[10];运行结果

【C++数据结构】启航,打开新世界的大门!_数据结构_02

arr[9];运行结果

【C++数据结构】启航,打开新世界的大门!_C_03

这只是一个演示,后面真正构建的时候会更复杂!!!,希望大家好好理解上面的代码

标签:链表,const,启航,可以,C++,char,数据结构
From: https://blog.51cto.com/u_16176403/6940967

相关文章

  • protobuf在c++中的使用
    一、安装sudoaptinstalllibprotobuf-devprotobuf-compiler二、编辑proto文件,生成代码文件proto语法分为“proto2”和”proto3“两个版本,指定方法是在proto文件中第一行写入:syntax="proto3";,这样指定使用proto3版本的语法,如果不指定,默认是使用proto2的语法。两个语法的......
  • C/C++ 数据结构五大核心算法之分治法
    分治法——见名思义,即分而治之,从而得到我们想要的最终结果。分治法的思想是将一个规模为N的问题分解为k个较小的子问题,这些子问题遵循的处理方式就是互相独立且与原问题相同。两部分组成:分(divide):递归解决较小的问题治(conquer):然后从子问题的解构建原问题的解三个步骤:1、......
  • 第三阶段C++提高编程(黑马程序员)——Day9
    2STL初识2.1STL的诞生长久以来,软件界一直希望建立一种可重复利用的东西C++的面向对象和泛型编程思想,目的就是复用性的提升大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作为了建立数据结构和算法的一套标准诞生了STL2.2STL基本概念STL(StandardTemplateLib......
  • 【八股文 02】C++ 进程内存布局及其相关知识
    1引言本文环境为Linux操作系统(x86)+C++。目的是了解进程内存布局,但是在了解的过程中发现需要前置一些知识,因此内容概览如下所示:1C/C++程序从源代码到可执行程序的构建过程1.1预处理,也叫预编译1.2编译1.3汇编1.4链接2各平台文件格式3ELF文件3.1ELF文......
  • 【八股文 00】C++ 八股文合集
    1前言1.1八股文是什么八股文本来是明清科举考试的一种文体,绝对不允许自由发挥,而句子的长短、字的繁简、声调的高低等也都要相对成文,字数也有限制。那么总结一下,八股文的特点是:不允许自由发挥,题目,内容,格式都被严格限制,必须遵守相应的定式那么计算机八股文就比较好理解了,就是......
  • 数据结构--排序
    什么是排序?排序:将无序序列排成一个有序序列的运算.排序的应用非常广泛.排序方法的分类按照储存介质分类.内部排序:数据量不大,数据在内存,无序内外存交换数据.外部排序:数据量较大,数据在外存(文件排序).按比较器个数分类串行排序:单处理机(同一时刻比较一对元素)......
  • c++求平均年纪
    班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。#include<cstdio>usingnamespacestd;intmain(){ intn,t; doubles; s=0;   //s储存班上同学年龄之和,初始值赋值为0 scanf("%d",&n);   for(inti=1;i<=n;++i) //循环累加班......
  • 要在 Dev-C++ 中添加 SFML 库,你需要按照以下步骤进行设置:
    下载SFML:首先,你需要从SFML官方网站下载适用于你的编译器(例如MinGW)和操作系统的SFML库。确保下载正确版本的SFML(32位或64位)和与你的编译器兼容的版本。配置Dev-C++环境:打开Dev-C++,转到"Tools"(工具)菜单,然后选择"CompilerOptions"(编译器选项)。添加S......
  • c++共享锁shared_mutex
    shared_mutexshared_mutex::lock()用法同mutex::lock()shared_mutex::lock_shared()允许多线程同时进入临界区,只用用于只读场景,不然是线程不安全的shared_mutex::lock_shared()与shared_mutex::lock()互斥,不能同时上锁#include<shared_mutex>#include<iostream>#include......
  • 考研数据结构——每日一题[WPL]
    3766.二叉树的带权路径长度二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和,也就是每个叶结点的深度与权值之积的总和。给定一棵二叉树T,请你计算并输出它的WPL。注意,根节点的深度为0。样例输入:二叉树[8,12,2,null,null,6,4,null,null,null,nul......