Geekban极客班 C++ STL与泛型编程 第一周作业
来源:互联网 发布:美国种族歧视 知乎 编辑:程序博客网 时间:2024/05/20 16:01
特征Traits
char szNames[]="abc";std::size_t nLength=strlen(szNames);char* p=szNames;char* q=szNames+nLength;printf("Sigma(szNames)=%d\n",Siqma(p,q));
调用后结果为38,实际结果应为294
因为发生了溢出。char的最大值为255。
解决方法:为Siqma的参数类型建立关联,将其关联至另一个类型,数据返回的类型将改为关联的类型,防止数据的溢出。如char->int,short->int,int->long
Traits的实现
将char关联成int、将short关联成int、将int关联成long、将unsigned int关联成unsigned long、将float关联成double
template<typename T>inline T Sigma(const T const& start,const T const&end){ T total=T(); while(start!=end){ total+=*start++; } return total;}
template<typename T>inline typename SigmaTraits<T>::ReturnType Sigma(const T const& start,const T const& end){ typedef typename SigmaTraits<T>::ReturnType ReturnType; ReturnType s=ReturnType(); while(start!=end0) s+=*start++; return s;}
其中typename SigmaTraits::ReturnType为返回类型。
根据传入Sigma( , )的参数类型可以推出typename SigmaTraits::ReturnType的类型。
Trait 处理共通类型
(补充自The C++ Standard Library)
template<typename T1,typename T2>typename std::common_type<T1,T2>::type min(const T1& x,const T2& y);
当T1,T2类型不同,但是拥有共通类型,使用上述程序可以将两种参数转换为一种参数。如int和long,std::common_type会产生int,string和char,会产生std::string。
迭代器
迭代器是一个“可以遍历STL容器全部或部分元素”的对象,用来表现出容器中的某一个位置。
在STL中是容器与算法之间的接口,算法通常以迭代器作为输入参数。
基本思想:
Vector
Vector是一个能够存放任意类别的动态数组
Vector指出动态空间大小调整,内部会自动扩充内存空间。
使用方法
Vector支持随机访问,提供随机访问迭代器,适用于任何STL算法。
#include<vector>int main(){ std::vector v;}
- vector c 产生一个空的vector,无任何元素
- vectorc(c2) 建立c并成为c2的一份拷贝
- vectorc=c2 建立一个新的vector作为c2的拷贝
- vectorc(rv) 建立一个新的vector,取rvalue rv的内容
- vectorc=rv 建立一个新的vector,取rvalue rv的内容
- vectorc(n) 建立一个大小为n的vector
- vectorc(n,elem) 建立一个大小为n的vector,每个值为elem
- vectorc(beg,end) 建立一个vector,以区间【beg,end】作为元素初值
- c.~vector() 销毁所有元素,释放内存
非更易型操作
- c.empty()返回是否为空
- c.size()返回目前元素个数
- c.max_size()返回元素个数之最大可能量
- c.capacity()返回“不进行空间重新分配”条件下的元素最大容纳量
- c.reserve(num)如果容量不足,扩大之
- c.shrink_to_fit()要求降低容量,以符合元素个数
赋值操作
- c=c2**把c2的所有元素给c**
- c=rv**把rvalue rv的所有元素以move assign给c**
- c=initlist**将初值列initlist的所有元素给c**
- c=assign(n,elem)复制n个elem,赋值给c
- c.assign(beg,end)将区间[beg,end]中所有元素给c
- c.assign(initlist)将初值列initlist的所有元素赋值给c
- c1.swap(c2)置换c1和c2
- swap(c1,c2)置换c1和c2
元素访问
c[idx]返回索引idx所指的元素(不检查范围)
c.at(idx)返回索引idx所指的元素(如果idx超出范围就抛出异常)
插入与移除
- push_back(elem)附加一个elem的拷贝于末尾
- pop_back()移除最后一个元素,但是不返回
- insert(pos,elem)在pos位置之前插入一个elem拷贝,并返回新的位置
- insert(pos,n,elem)在pos位置之前插入n个elem拷贝,并返回第一个新元素的位置
- insert(pos,beg,end)在pos之前插入区间[beg,end)内的元素,并返回第一个新元素的位置
- emplace(pos,args…)在pos之前插入一个以args为初值的元素,并返回新元素的位置
- emplace_bakc(args…)附加一个以args为初值的元素于末尾,不返回
- erase(pos)移除pos位置上的元素,返回下一个元素的位置
- resize(num)将元素数量改为num(如果size()变大,多出来的元素以default完成初始化)
- resize(num,elem)将元素数量改为num(如果size()变大,多出的的元素都是elem的拷贝)
- Geekban极客班 C++ STL与泛型编程 第一周作业
- Geekban极客班C++STL与泛型编程 第二周
- Geekban极客班C++ STL与泛型编程 第三周
- STL与泛型编程第一周作业
- Geekband STL与泛型编程 第一周作业
- 极客班STL与泛型编程 第一周学习笔记
- STL与泛型编程-第一周笔记-Geekband
- Boolan STL与泛型编程 第一周笔记
- Boolan STL与泛型编程 第一周笔记
- GeekBand笔记-《STL与泛型编程 》 第一周
- 第一周编程作业
- Geekband STL与泛型编程 第一周笔记 暗影行者
- Geekban极客班C++ 第四周
- java第一周编程作业
- scala 第一周编程作业
- c语言第一周作业
- (Boolan)STL与泛型编程作业一
- 第一周编程作业1 温度转换
- S3c2440裸机程序【1】跑马灯
- [数据库] Oracle单表查询总数及百分比和数据横向纵向连接
- poj2749 Building roads
- 解决android:background背景图片被拉伸问题
- Bzoj3270:博物馆:概率与期望,高斯消元
- Geekban极客班 C++ STL与泛型编程 第一周作业
- 机器学习---knn分类器
- JAVA对象内存布局 以及对象定位
- leetcode 34. Search for a Range
- RadioGroup+Fragment实现Tab切换
- java 中介者模式
- DP最长公共子序列
- c++结构体学习记录
- js闭包