泛型实现STL单链表,队列,栈

本文介绍了作者因遇到STL空间限制问题而重写了三个常用STL容器:List、Queue和Stack,并分享了实现代码及简单测试对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

竞赛选手,重写这三个比较常用的STL是因为今天遇到卡STL空间的某道题目。重写过程也算锻炼工程能力了。
使用方法同STL,顺便加了print函数输出。具体越界情况没怎么处理(都是熟手了这点就算了吧,再说加了这些复杂度就上去了不是吗?)
有空会继续更的(然而这只是一句自欺欺人的话罢了)

template <typename t> class List
{
public:
    int n = 0;
    struct Node
    {
        t data;
        Node* next = nullptr;
    };
    Node* head = new Node, * tail = head;
    t *begin()
    {
        return &(head->next->data);
    }
    t* end()
    {
        return &(tail->next->data);
    }
    int size()
    {
        return n;
    }
    void push(t num)
    {
        Node* node = new Node; n++;
        node->data = num; tail->next = node; tail = node;
    }
    void insert(int ad, t num)
    {
        Node* ptr = head; int cnt = 0;
        if (ad <= n)
            while (ptr->next != nullptr)
            {
                ptr = ptr->next; cnt++;
                if (ad == cnt)
                {
                    Node* node1 = new Node;
                    node1->data = num; node1->next = ptr->next; ptr->next = node1; n++;
                    return;
                }
            }
        else push(num);
    }
    void erase(int ad)
    {
        Node* ptr = head, * ptr1; int cnt = 0;
        if (ad <= n)
            while (ptr->next != nullptr)
            {
                ptr1 = ptr; ptr = ptr->next; cnt++;
                if (ad == cnt)
                {
                    ptr1->next = ptr->next;
                    delete(ptr); n--;
                    return;
                }
            }
    }
    void change(int ad, t num)
    {
        Node* ptr = head; int cnt = 0;
        if (ad <= n)
            while (ptr->next != nullptr)
            {
                ptr = ptr->next; cnt++;
                if (ad == cnt)
                {
                    ptr->data = num;
                    return;
                }
            }
    }
    void check(int ad)
    {
        Node* ptr = head; int cnt = 0;
        if (ad <= n)
            while (ptr->next != nullptr)
            {
                ptr = ptr->next; cnt++;
                if (ad == cnt)
                {
                    if (typeid(ptr->data) == typeid(int)) { printf("%d\n",ptr->data); }
                    else if (typeid(ptr->data) == typeid(long long)) { printf("%lld\n",ptr->data); }
                    else { printf("%lf\n",ptr->data); }
                    return;
                }
            }
    }
    void print()
    {
        Node* ptr = head;
        while (ptr->next != nullptr)
        {
            ptr = ptr->next;
            if (typeid(ptr->data) == typeid(int)) { printf("%d\n",ptr->data); }
            else if (typeid(ptr->data) == typeid(long long)) { printf("%lld\n",ptr->data); }
            else { printf("%lf\n",ptr->data); }
        }
        puts("");
    }
};
template <typename t> class Quene
{
public:
    int n = 0;
    struct Node
    {
        t data;
        Node* next = nullptr;
    };
    Node* head = new Node, * tail = head;
    t* begin()
    {
        return &(head->next->data);
    }
    t* end()
    {
        return &(tail->next->data);
    }
    int size()
    {
        return n;
    }
    void push(t num)
    {
        Node* ptr = new Node; n++;
        ptr->data = num; tail->next = ptr; tail = ptr;
    }
    t front()
    {
        return head->next->data;
    }
    void pop()
    {
        Node* ptr = head->next; n--;
        delete head; head = ptr;
    }
    void print()
    {
        Node* ptr = head;
        while (ptr->next != nullptr)
        {
            ptr = ptr->next;
            if (typeid(ptr->data) == typeid(int)) { printf("%d\n",ptr->data); }
            else if (typeid(ptr->data) == typeid(long long)) { printf("%lld\n",ptr->data); }
            else { printf("%lf\n",ptr->data); }
        }
        puts("");
    }
};
};
template <typename t> class Stack
{
public:
    int n = 0;
    struct Node
    {
        t data;
        Node* next = nullptr;
    };
    Node* head = new Node, * tail = head;
    t* begin()
    {
        return &(head->next->data);
    }
    t* end()
    {
        return &(tail->next->data);
    }
    int size()
    {
        return n;
    }
    void push(int num)
    {
        Node* ptr = new Node; n++;
        ptr->data = num, ptr->next = head->next; head->next = ptr;
        if (n == 1) tail = ptr;
    }
    int top()
    {
        return head->next->data;
    }
    void pop()
    {
        Node* ptr = head->next; n--;
        delete head; head = ptr;
    }
    void print()
    {
        Node* ptr = head;
        while (ptr->next != nullptr)
        {
            ptr = ptr->next;
            if (typeid(ptr->data) == typeid(int)) { printf("%d\n",ptr->data); }
            else if (typeid(ptr->data) == typeid(long long)) { printf("%lld\n",ptr->data); }
            else { printf("%lf\n",ptr->data); }
        }
        puts("");
    }
};
};

后记:测试(Test1为STL的list,Test2为改写的)
选了list存入1e6的数据,差距还是十分明显的

int main()
{
    clock_t start1 = clock();
    list <int> l1;
    for (int i = 0; i < 1e6; i++) l1.push_back(i);
    clock_t end1 = clock();
    cout <<"Test1:" <<end1 - start1 << " ms" << endl;
    clock_t start2 = clock();
    List <int> l2;
    for (int i = 0; i < 1e6; i++) l2.push(i);
    clock_t end2 = clock();
    cout << "Test2:" << end2 - start2 << " ms" << endl;
    return 0;
}

### 关于 UniApp 框架推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值