c++中的stl和泛型
c++是一门多范式的语言,其中就包括泛型,泛型有可以细分为泛型方法和泛型类。无处不在的stl,就是泛型最经典的应用场景。c++泛型的实现原理就是在调用时传入真正的类型。其泛型相比于java,本人感觉不太好用,定义命名时也有些冗余,先上代码。
1 2 3 4 5 6 7 | //记住这些经典的代码,它可以让你理解语言<br>//但是c++的参数类型使泛型也变的有点难了,比如max(12,13),max(i,j)等<br>template <typename T> T max(T a,T b){ if (a>b){ return a} else { return b;<br> } } // 可以看到,虽然理论上T可以是任意类型,但是其必须支持比较操作>,c++没有对类型进行限定,但并不是传人任意类型就可以的。<br><br> |
stl中还有一个非常重要的概念:迭代器,其目的就是为操作容器中的元素。数组指针就是一个经典的迭代器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //这是一个泛型的常量前向迭代器,可以改变容器中元素大值,可读可写<br>template <typename T> struct list_iterator { list_iterator(list_entry<T> *entry):entry(entry){ } T& operator *(){ cout<< "the T& has been used" <<endl; return entry->value; } //常量对象调用 const T& operator *() const { cout<< "the const T& has been used" <<endl; return entry->value; } // it.operator++(),使用int来区分前缀和后缀 list_iterator<T>& operator ++( int ){ entry= entry->next;<br> //this是指针,*this返回了对象 return * this ; } // !=重载这个符号, 返回为bool,while,if等判断条件。 bool operator !=(list_iterator<T> other){ //成员指针是否指向同一个地址 if (other.entry== entry){ return false ; } else { return true ; } } list_entry<T> * entry; }; |
其vector,list,set,map和java中的容器有异曲同工之妙,不同之处在于java中容器提供的接口更统一,方法更多,还有很多工具类,反之,c++就比较简陋了,但是其可以基本类型为泛型参数,写起来更简洁一些。看一些c++中stl的经典写法。
1 2 3 4 5 6 | int a = {2,32,32,90}; vector< int > vt (a,a+4); // 数组转换为vector。 set < int > s(v.begin(),v.end()) ; // vector转换为set bool flag=s.insert(value).second; // set会返回添加是否成功 map< int , int > m; // 可以用来对整数计数. m[n] ++; |
日进有功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义