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

【C++初阶】STL详解(五)List的介绍与使用

本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:C++
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

STL详解(五)

  • list的介绍
  • 定义方式:
  • 迭代器相关函数:
    • begin与end
    • rbegin与rend
  • 修改相关:
    • push_front pop_front
    • push_back pop_back
    • insert
    • erase
    • resize
    • clear与size
  • slist操作相关:
    • sort
    • splice
    • remove
    • remove_if
    • unique
    • merge
    • revise
    • assgin
    • swap

list的介绍

在这里插入图片描述

1.list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。

3.list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。

4.与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。

5.list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)。

定义方式:

在这里插入图片描述
第一个是无参构造。
第二个是用n个val初始化list对象。
第三个是用一段迭代器区间构造。
第四个是用一个初始值构造。

示例:

list<int> l1;//无参构造
list<int> l2(10,5);//用10个5初始化链表
vector<int> vv{1,2,3,4,5,6};
list<int> l3(vv.begin(),vv.end());//用迭代器区间初始化
list<char> l4('a');//用一个字符来初始化

list的拷贝构造和析构函数在使用
但使用list时不会显示调用,所以将它们忽略掉

迭代器相关函数:

与迭代器相关的有以下这些:
在这里插入图片描述

begin与end

与之前类似,我们可以使用迭代器的方式对链表进行遍历访问与读写操作。

示例:

list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);//读
list<int>::iterator it = lt.begin();
while (it != lt.end())
{*it *= 20;cout << *it << " ";it++;
}
cout << endl;
auto rit = lt.begin();
//写
while (rit != lt.end())
{*rit += 20;cout << *rit << " ";rit++;
}
cout << endl;

当然,支持迭代器就支持范围for:

//范围for
for(auto e: lt)
{cout << e <<" ";
}

测试结果:
在这里插入图片描述
这里我们用到了尾插。

rbegin与rend

有正向迭代器也就有反向迭代器:

vector<int> vv{ 1,2,3,4,5,6 };vector<int>::reverse_iterator rit = vv.rbegin();
//读
while (rit != vv.rend())
{cout << *rit << " ";rit++;
}
cout << endl;
auto rrit = vv.rbegin();
//写
while (rrit != vv.rend())
{*rrit += 20;cout << *rrit << " ";rrit++;
}
cout << endl;
//范围for
for(auto e:vv)
{cout << e << " ";
}

测试结果:
在这里插入图片描述

修改相关:

与修改相关的函数接口有以下这些:
在这里插入图片描述

push_front pop_front

push_front函数用于头插一个数据,pop_front函数用于头删一个数据。

list<int> lt;
lt.push_front(1);
lt.push_front(2);
lt.push_front(3);
lt.push_front(4);
lt.push_front(5);
//遍历
for (auto e : lt)
{cout << e << " ";}
cout << endl;
lt.pop_front();
lt.pop_front();
lt.pop_front();
lt.pop_front();
for (auto h : lt)
{cout << h << " ";
}
cout << endl;

在这里插入图片描述

push_back pop_back

push_back函数用于尾插一个数据,pop_back函数用于尾删一个数据。

示例:

list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);//遍历
for (auto e : lt)
{cout << e << " ";
}
cout << endl;
lt.pop_back();
lt.pop_back();
lt.pop_back();
lt.pop_back();
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

在这里插入图片描述

insert

在这里插入图片描述

list当中的insert函数支持三种插入方式:

1.在指定迭代器位置插入一个数。
2.在指定迭代器位置插入n个值为val的数。
3.在指定迭代器位置插入一段迭代器区间(左闭右开)

示例:

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);list<int>::iterator pos = find(lt.begin(), lt.end(), 2);lt.insert(pos, 9); //在2的位置插入9for (auto e : lt){cout << e << " ";}cout << endl; //1 9 2 3pos = find(lt.begin(), lt.end(), 3);lt.insert(pos, 2, 8); //在3的位置插入2个8for (auto e : lt){cout << e << " ";}cout << endl; //1 9 2 8 8 3vector<int> v(2, 7);pos = find(lt.begin(), lt.end(), 1);lt.insert(pos, v.begin(), v.end()); //在1的位置插入2个7for (auto e : lt){cout << e << " ";}cout << endl; //7 7 1 9 2 8 8 3

测试结果:
在这里插入图片描述

erase

在这里插入图片描述

list当中的erase函数支持两种删除方式:

1.删除指定迭代器位置的元素。
2.删除指定迭代器区间(左闭右开)的所有元素。

示例:

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::iterator pos = find(lt.begin(), lt.end(), 2);lt.erase(pos); //删除2for (auto e : lt){cout << e << " ";}cout << endl; //1 3 4 5pos = find(lt.begin(), lt.end(), 4);lt.erase(pos, lt.end()); //删除4及其之后的元素for (auto e : lt){cout << e << " ";}cout << endl; //1 3

在这里插入图片描述

resize

在这里插入图片描述

resize的两种情况:

1.当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。

2.当所给值小于当前的size时,将size缩小到该值。

示例:

list<int> lt(5, 3);
for (auto e : lt)
{cout << e << " ";
}
cout << endl; //3 3 3 3 3
lt.resize(7, 6); //将size扩大为7,扩大的值为6
for (auto e : lt)
{cout << e << " ";
}
cout << endl; //3 3 3 3 3 6 6
lt.resize(2); //将size缩小为2
for (auto e : lt)
{cout << e << " ";
}
cout << endl; //3 3

在这里插入图片描述

clear与size

在这里插入图片描述
在这里插入图片描述

clear函数用于清空容器,清空后容器的size为0。
size用于获取容器中有效元素的个数。
在刚测试resize后面加一下:清理一下空间

lt.clear();
for (auto e : lt)
{cout << e << " ";
}
cout << endl;
cout << lt.size();

测试结果:
在这里插入图片描述

slist操作相关:

与其他容器不同的是,我们可以值得重点关注一下list的一些与操作相关的接口函数:
在这里插入图片描述

sort

在这里插入图片描述

sort函数可以将容器当中的数据默认排为升序。

示例:

list<int> lt;
lt.push_back(4);
lt.push_back(7);
lt.push_back(5);
lt.push_back(9);
lt.push_back(6);
lt.push_back(0);
lt.push_back(3);
for (auto e : lt)
{cout << e << " ";
}
cout << endl; //4 7 5 9 6 0 3
lt.sort(); //默认将容器内数据排为升序
for (auto e : lt)
{cout << e << " ";
}
cout << endl; //0 3 4 5 6 7 9

在这里插入图片描述

splice

在这里插入图片描述

splice函数用于两个list容器之间的拼接,其有三种拼接方式:

1.将整个容器拼接到另一个容器的指定迭代器位置。
2.将容器当中的某一个数据拼接到另一个容器的指定迭代器位置。
3.将容器指定迭代器区间的数据拼接到另一个容器的指定迭代器位置。

示例:

list<int> lt1(4, 2);list<int> lt2(4, 6);lt1.splice(lt1.begin(), lt2); //将容器lt2拼接到容器lt1的开头for (auto e : lt1){cout << e << " ";}cout << endl; //6 6 6 6 2 2 2 2 list<int> lt3(4, 2);list<int> lt4(4, 6);lt3.splice(lt3.begin(), lt4, lt4.begin()); //将容器lt4的第一个数据拼接到容器lt3的开头for (auto e : lt3){cout << e << " ";}cout << endl; //6 2 2 2 2 list<int> lt5(4, 2);list<int> lt6(4, 6);lt5.splice(lt5.begin(), lt6, lt6.begin(), lt6.end()); //将容器lt6的指定迭代器区间内的数据拼接到容器lt5的开头for (auto e : lt5){cout << e << " ";}cout << endl; //6 6 6 6 2 2 2 2

测试结果:
在这里插入图片描述
注意: 容器当中被拼接到另一个容器的数据在原容器当中就不存在了。(实际上就是将链表当中的指定结点拼接到了另一个容器当中)

remove

在这里插入图片描述

remove函数用于删除容器当中特定值的元素。
示例:

list<int> lt;lt.push_back(1);lt.push_back(4);lt.push_back(3);lt.push_back(3);lt.push_back(2);lt.push_back(2);lt.push_back(3);for (auto e : lt){cout << e << " ";}cout << endl; //1 4 3 3 2 2 3lt.remove(3); //删除容器当中值为3的元素for (auto e : lt){cout << e << " ";}cout << endl; //1 4 2 2

测试结果:
在这里插入图片描述

remove_if

在这里插入图片描述

remove_if函数用于删除容器当中满足条件的元素。

示例:

bool single_digit(const int& val)
{return val < 10;
}
list<int> lt;lt.push_back(10);lt.push_back(4);lt.push_back(7);lt.push_back(18);lt.push_back(2);lt.push_back(5);lt.push_back(9);for (auto e : lt){cout << e << " ";}cout << endl; //10 4 7 18 2 5 9lt.remove_if(single_digit); //删除容器当中值小于10的元素for (auto e : lt){cout << e << " ";}cout << endl; //10 18

测试结果:
在这里插入图片描述

unique

在这里插入图片描述

unique函数用于删除容器当中连续的重复元素。
示例:

list<int> lt;lt.push_back(1);lt.push_back(4);lt.push_back(3);lt.push_back(3);lt.push_back(2);lt.push_back(2);lt.push_back(3);for (auto e : lt){cout << e << " ";}cout << endl; //1 4 3 3 2 2 3lt.sort(); //将容器当中的元素排为升序lt.unique(); //删除容器当中连续的重复元素for (auto e : lt){cout << e << " ";}cout << endl; //1 2 3 4

测试结果:
在这里插入图片描述
注意: 若想使用unique函数做到真正的去重,还需在去重前对容器内元素进行排序。

merge

在这里插入图片描述

merge函数用于将一个有序list容器合并到另一个有序list容器当中,使得合并后的list容器任然有序。(类似于归并排序)
示例:

list<int> lt1;lt1.push_back(3);lt1.push_back(8);lt1.push_back(1);list<int> lt2;lt2.push_back(6);lt2.push_back(2);lt2.push_back(9);lt2.push_back(5);lt1.sort(); //将容器lt1排为升序lt2.sort(); //将容器lt2排为升序lt1.merge(lt2); //将lt2合并到lt1当中for (auto e : lt1){cout << e << " ";}cout << endl; //1 2 3 5 6 8 9 

测试结果:
在这里插入图片描述

revise

在这里插入图片描述

reverse函数用于将容器当中元素的位置进行逆置。
示例:

list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);lt.reverse(); //将容器当中元素的位置进行逆置for (auto e : lt){cout << e << " ";}cout << endl; //5 4 3 2 1 

测试结果:
在这里插入图片描述

assgin

在这里插入图片描述

assign函数用于将新内容分配给容器,替换其当前内容,新内容的赋予方式有两种:

1.将n个值为val的数据分配给容器。
2.将所给迭代器区间当中的内容分配给容器。

示例:

list<char> lt(3, 'a');lt.assign(3, 'b'); //将新内容分配给容器,替换其当前内容for (auto e : lt){cout << e << " ";}cout << endl; //b b bstring s("hello world");lt.assign(s.begin(), s.end()); //将新内容分配给容器,替换其当前内容for (auto e : lt){cout << e << " ";}cout << endl; //h e l l o   w o r l d

测试结果:
在这里插入图片描述

swap

在这里插入图片描述

swap函数用于交换两个容器的内容。
示例:

list<int> lt1(4, 2);
list<int> lt2(4, 6);
lt1.swap(lt2); //交换两个容器的内容
for (auto e : lt1)
{cout << e << " ";
}
cout << endl; //6 6 6 6
for (auto e : lt2)
{cout << e << " ";
}
cout << endl; //2 2 2 2

测试结果:
在这里插入图片描述

相关文章:

【C++初阶】STL详解(五)List的介绍与使用

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…...

MySQL特点和基本语句

MySQL MySQL是一种流行的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现属于甲骨文公司&#xff08;Oracle&#xff09;旗下产品。MySQL是基于C语言开发的&#xff0c;它具有高性能、可扩展性、易用性等特点&#xff0c;并且支持大量的用户访问。 My…...

Gin 学习笔记03-参数绑定

参数绑定 1、ShouldBindJSON2、ShouldBindQuery3、ShouldBindUri4、ShouldBind 1、ShouldBindJSON package mainimport ("github.com/gin-gonic/gin""net/http" )type User struct {Name string json:"name"Gender string json:"gender&…...

【100天精通Python】Day73:python机器学习入门算法详解与代码示例

目录 1. 监督学习算法&#xff1a; 1.1 线性回归&#xff08;Linear Regression&#xff09;&#xff1a; 1.2 逻辑回归&#xff08;Logistic Regression&#xff09;&#xff1a; 1.3 决策树&#xff08;Decision Tree&#xff09;&#xff1a; 1.4 支持向量机&#xff…...

Node.js入门指南(四)

目录 express框架 express介绍 express使用 express路由 express 响应设置 中间件 路由模块化 EJS 模板引擎 express-generator hello&#xff0c;大家好&#xff01;上一篇文章我们介绍了Node.js的模块化以及包管理工具等知识&#xff0c;这篇文章主要给大家分享Nod…...

Java LeetCode篇-深入了解关于数组的经典解法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 轮转数组 1.1 使用移位的方式 1.2 使用三次数组逆转法 2.0 消失的数字 2.1 使用相减法 2.2 使用异或的方式 3.0 合并两个有序数组 3.1 使用三指针方式 3.2 使用合…...

LeeCode前端算法基础100题(4)- 无重复字符的最长子串

一、问题详情&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb…...

Axios简单使用与配置安装-Vue

安装Axios npm i axios main.js 导入 import Axios from axios Vue.prototype.$axios Axios简单发送请求 get getTest() {this.$axios({method: GET,url: https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/}).then(res > {//请求成功回调console.log(res)}…...

【初始前后端交互+原生Ajax+Fetch+axios+同源策略+解决跨域】

初始前后端交互原生AjaxFetchaxios同源策略解决跨域 1 初识前后端交互2 原生Ajax2.1 Ajax基础2.2 Ajax案例2.3 ajax请求方式 3 Fetch3.1 fetch基础3.2 fetch案例 4 axios4.1 axios基础4.2 axios使用4.2.1 axios拦截器4.2.2 axios中断器 5 同源策略6 解决跨域6.1 jsonp6.2 其他技…...

C语言--每日选择题--Day24

第一题 1. 在C语言中&#xff0c;非法的八进制是&#xff08; &#xff09; A&#xff1a;018 B&#xff1a;016 C&#xff1a;017 D&#xff1a;0257 答案及解析 A 八进制是0&#xff5e;7的数字&#xff0c;所以A错误 第二题 2. fun((exp1,exp2),(exp3,exp4,exp5))有几…...

记一次简单的PHP反序列化字符串溢出

今天朋友给的一道题&#xff0c;让我看看&#xff0c;来源不知&#xff0c;随手记一下 <?php // where is flag error_reporting(0); class NFCTF{ public $ming,$id,$payload,$nothing;function __construct($iii){$this->ming$ii…...

找工作面试技巧

问题描述&#xff1a;找工作时&#xff0c;不知道如何回答问题怎么办。 问题解决&#xff1a;可以尝试使用STAT原则来回答问题。具体如下。 "STAR" 原则是一种常用于回答面试问题的方法&#xff0c;特别是在描述个人经验、解决问题或展示技能和能力时。"STAR&q…...

Jackson无缝替换Fastjson

目录 文章目录 一&#xff0c;Fastjson到Jackson的替换方案方案代码序列化反序列化通过key获取某种类型的值类型替换 二&#xff0c;Springboot工程中序列化的使用场景三&#xff0c;SpringMVC框架中的Http消息转换器1&#xff0c;原理&#xff1a;2&#xff0c;自定义消息转换…...

JVM 内存分析工具 MAT及实践

线程分析工具 MAT 官网下载地址&#xff1a;http://www.eclipse.org/mat/downloads.php mat百度网盘链接&#xff1a;&#xff08;速度更快&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1tMp8MQIXuPtg9zBgruO0Ug?pwdjqtv 提取码&#xff1a;jqtv jdk17 百度网盘链接…...

jupyter notebook 不知道密码,怎么登录解决办法

jupyter notebook 不知道密码&#xff0c;怎么登录解决办法 1、 windows下&#xff0c;打开命令行&#xff0c;输入jupyter notebook list &#xff1a; C:\Users\tom>jupyter notebook list Currently running servers: http://localhost:8888/?tokenee8bb2c28a89c8a24d…...

软著项目推荐 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…...

WEB渗透—反序列化(七)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…...

牛客网刷题笔记四 链表节点k个一组翻转

NC50 链表中的节点每k个一组翻转 题目&#xff1a; 思路&#xff1a; 这种题目比较习惯现在草稿本涂涂画画链表处理过程。整体思路是赋值新的链表&#xff0c;用游离指针遍历原始链表进行翻转操作&#xff0c;当游离个数等于k时&#xff0c;就将翻转后的链表接到新的链表后&am…...

【数据结构】图<简单认识图>

对于下面的内容&#xff0c;大家着重观察和理解图即可&#xff0c;可以直接绕过一些文字性的概念&#xff0c;对图有一个大概的认识。 图 简单认识图图的定义有向图和无向图完全图无向完全图有向完全图 图的基本存储结构邻接矩阵存储邻接矩阵的优点 网络的邻接矩阵邻接表无向图…...

Git介绍和基础命令解析

Git基本操作指令 工作区和暂存区 Git管理的文件分为&#xff1a;工作区(本地的文件夹)&#xff0c;版本库(.git文件夹)&#xff0c;版本库又分为暂存区stage和暂存区分支master(仓库) 工作区>>>>暂存区>>>>仓库 git add把文件从工作区>>>…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...