当前位置: 首页 > news >正文

c++:STL介绍

. STL简介
  • 定义:STL(Standard Template Library)是C++标准库的重要组成部分,是一个可复用的组件库,包含数据结构和算法的软件框架。

  • 版本

    • 原始版本:由Alexander Stepanov和Meng Lee在惠普实验室完成,开源,允许任意使用和修改。

    • P. J. 版本:由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不可公开或修改,可读性低。

    • RW版本:由Rouge Wage公司开发,继承自HP版本,被C++ Builder采用,不可公开或修改,可读性一般。

    • SGI版本:由Silicon Graphics Computer Systems, Inc公司开发,继承自HP版本,被GCC (Linux)采用,可移植性好,可公开、修改甚至贩卖,阅读性高。

2. STL的六大组件
  • 容器:存储数据的结构,如vector, list, map等。

  • 迭代器:提供访问容器中元素的接口,如iterator, reverse_iterator等。

  • 算法:对容器中的数据进行操作的函数,如sort, find, copy等。

  • 函数对象:用于封装函数的类,如plus, multiplies等。

  • 配接器:用于扩展容器或迭代器的功能,如stack, queue, priority_queue等。

  • 存储器:管理内存分配和释放,如allocator

1. 二叉树层序打印

问题描述:给定一个二叉树,按照层序遍历的顺序打印节点值。

解决方案

  • 使用std::queue实现层序遍历。

  • #include <iostream>
    #include <queue>
    using namespace std;
    
    struct TreeNode {
        int val;
        TreeNode* left;
        TreeNode* right;
        TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    };
    
    void levelOrder(TreeNode* root) {
        if (!root) return;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            TreeNode* node = q.front();
            q.pop();
            cout << node->val << " ";
            if (node->left) q.push(node->left);
            if (node->right) q.push(node->right);
        }
    }
2. 重建二叉树

问题描述:给定二叉树的前序遍历和中序遍历结果,重建二叉树。

解决方案

  • 使用std::map存储中序遍历的索引,方便快速查找。

  • #include <iostream>
    #include <map>
    using namespace std;
    
    struct TreeNode {
        int val;
        TreeNode* left;
        TreeNode* right;
        TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    };
    
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        map<int, int> inorderMap;
        for (int i = 0; i < inorder.size(); ++i) {
            inorderMap[inorder[i]] = i;
        }
        return buildTreeHelper(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1, inorderMap);
    }
    
    TreeNode* buildTreeHelper(vector<int>& preorder, int preStart, int preEnd, vector<int>& inorder, int inStart, int inEnd, map<int, int>& inorderMap) {
        if (preStart > preEnd || inStart > inEnd) return nullptr;
        TreeNode* root = new TreeNode(preorder[preStart]);
        int inRootIndex = inorderMap[root->val];
        int leftTreeSize = inRootIndex - inStart;
        root->left = buildTreeHelper(preorder, preStart + 1, preStart + leftTreeSize, inorder, inStart, inRootIndex - 1, inorderMap);
        root->right = buildTreeHelper(preorder, preStart + leftTreeSize + 1, preEnd, inorder, inRootIndex + 1, inEnd, inorderMap);
        return root;
    }
3. 两个栈实现一个队列

问题描述:使用两个栈实现一个队列的功能,支持入队和出队操作。

解决方案

  • 使用std::stack实现队列的入队和出队操作。

  • #include <iostream>
    #include <stack>
    using namespace std;
    
    class MyQueue {
        stack<int> inStack, outStack;
    public:
        void push(int x) {
            inStack.push(x);
        }
        void pop() {
            if (outStack.empty()) {
                while (!inStack.empty()) {
                    outStack.push(inStack.top());
                    inStack.pop();
                }
            }
            outStack.pop();
        }
        int top() {
            if (outStack.empty()) {
                while (!inStack.empty()) {
                    outStack.push(inStack.top());
                    inStack.pop();
                }
            }
            return outStack.top();
        }
        bool empty() {
            return inStack.empty() && outStack.empty();
        }
    };

相关文章:

  • Rank-Analysis 预组队识别(英雄联盟)
  • Qwen2-VL 的重大省级,Qwen 发布新旗舰视觉语言模型 Qwen2.5-VL
  • Flask和Django相比哪个更适合新手?
  • mac搭建环境
  • 【第2章:神经网络基础与实现——2.2反向传播算法详解与实现步骤】
  • 冒泡排序的缺陷及优化
  • ASP.NET Core SixLabors.ImageSharp 位图图像创建和下载
  • 2月14日情人节,致挚爱
  • Linux 驱动开发:字符设备、块设备与网络设备驱动详解​​
  • Linux驱动层学习:LED 驱动开发
  • 前端开发入门一
  • c# 对象属性拷贝 解决方案
  • NPDP学习笔记 -产品经理(第二版)-第二章 组合管理
  • 为什么vue3需要对引入的组件使用markRaw?
  • 【Elasticsearch】词项中心(term-centric)和字段中心(field-centric)
  • 10bit VS 8bit 视频:色彩深度的较量,谁才是视觉盛宴的王者?
  • 【Sceneform-EQR】实现3D场景背景颜色的定制化(背景融合的方式、Filament材质定制)
  • OpenLayer创建第一个基础地图实例
  • “集团企业浪潮”(Conglomerate Wave):市盈率套利(P/E Arbitrage)与每股盈利增长的幻象
  • 基于深度学习的半导体领域关键技术创新与应用突破
  • qq企业邮箱怎么申请/如何优化推广中的关键词
  • 大气网站模板/手机百度一下百度
  • 保定网站优化/淘宝网络营销方式
  • 直播网站开发多少钱/seo整站优化什么价格
  • 企业网站设计注意/会计培训班要多少钱
  • wordpress多广告位/重庆seo整站优化效果