晓石头的博客
邮箱:178673693@qq.com
转载请注明出处,原文链接:http://blog.youkuaiyun.com/qiulanzhu/article/details/50458141
一、模版
1、函数模版:实现类型参数化,避免定义多个函数
例:
#include "stdafx.h"
#include <iostream>
using namespace std;
template<typename T> //或者template<class T>
T myMax(T a, T b)
{
return a>b ? a : b;
}
int main(int argc, char* argv[])
{
int ret1 = myMax(15, 30);
float ret2 = myMax(1.3, 3.6);
char ret3 = myMax('a', 'c');
cout<<ret1<<endl;
cout<<ret2<<endl;
cout<<ret3<<endl;
return 0;
}
2、类模版:避免写多个类
#include "stdafx.h"
#include <iostream>
using namespace std;
template<class T>
class MyMax
{
public:
MyMax(T a, T b):m_a(a),m_b(b){};
T GetMax(){ return m_a>m_b ? m_a : m_b; };
private:
T m_a;
T m_b;
};
int main(int argc, char* argv[])
{
MyMax<int> TestMaxInt(11, 55);
int ret1 = TestMaxInt.GetMax();
MyMax<char> TestMaxChar('a', 'z');
char ret2 = TestMaxChar.GetMax();
cout<<ret1<<endl;
cout<<ret2<<endl;
return 0;
}
可以指定多种类型的形参
template<typename T1, typename T2>
二、容器vector
1、vector对象的默认构造
vector采用模版类实现,vector对象的默认构造形式:vector<T> vecT;RU
如:
vector<int> vecInt; //存放int的vector容器
vector<float> vecFloat; //存放float的vector容器
vector<string> vecString; //存放string的vector容器
... //尖括号内还可以是指针类型和自定义类型
class CA{};
vector<CA*> vecpCA; //用于存放CA对象的指针的vector容器。
vector<CA> vecCA; //用于存放CA对象的vector容器,由于容器元素的存放是按值复制的方式进行的,所以,此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常。
2、vector对象的带参数构造
int iArray[] = {0,1,2,3,4};
vector<int> vecInt1(iArray, iArray+5);
vector<int> vecInt2(vecInt1.begin(), vecInt1.end());
vector<int> vecInt(3, 9);//容器里存放3个9
3、vector的赋值
vector.assign(beg,end);//将[beg,end)区间的数据拷贝赋值给本身。区间是左闭右开。
例:
int iArray[] = {1,2,3,4,5,6};
vector<int> vecInt1(iArray, iArray+6);
vector<int> vecInt;
vecInt.assign( vecInt1.begin()+1, vecInt1.begin()+3 );
vector.assign(n, elem);//将n个元素拷贝赋值给本身
例:vec.assign(3, 9);
vector& operator=(const vector &vec);//重载等号操作符
例:vet1 = vec2;
4、vector的数据存取
vec.at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
vec[idx];//返回索引idx所指的数据。
vec.front();//返回最前一个值,等价vec.at(0)
vec.back();//返回最后一个值
5、vector的大小
vector.size();//容器中元素的个数
vector.empty();//判断容器是否为空
vector.resize(num);//重新指定容器的长度为:num。
//长度变长,默认用0填充,长度变短,裁剪后面的元素
vector.resize(num, elem);//用指定元素填充
6、vector插入---增
iterator vector.insert(iterator loc, elem);//在位置pos插入元素elem的拷贝,返回新元素位置
例:
vector<int> vecInt(3,9);
vector<int>::iterator it = vecInt.insert(vecInt.begin(), 10);
void vector.insert(iterator loc, int n, elem)//在位置pos插入n个元素
例:vecInt.insert(vecInt.begin, 3, 8);
void vector.insert(iterator loc, beg, end);//在位置pos插入区间[beg, end)元素
例:vecInt.insert(vecInt.begin, vecInt1.begin(), vecInt1.end());
7、vector的删除---删
vector.clear();//移除容器的所有数据
vec.erase(beg, end);//删除区间[beg, end)的数据,返回下一个数据的位置
例:vecInt.erase(vecInt.begin(), vecInt.end()-1);
vec.erase(iterator loc);//删除loc位置的数据,返回下一个数据的位置
例:vecInt.erase(vecInt.begin()+1);
8、vector容器元素互换---改
将vec1和vec2元素互换
例:vec1.swap(vec2);//或者swap(vec1, vec2);
9、vector末尾的添加和移除操作---改
vector.push_back(elem);
vector.pop_back();
例:
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(2);
vecInt.push_back(3);
vecInt.push_back(4);
vecInt.push_back(5);
vector<int>::iterator iter;
for(iter = vecInt.begin(); iter != vecInt.end(); iter++)
{
cout<<*iter<<endl;
}
cout<<endl;
vecInt.pop_back();
for(iter = vecInt.begin(); iter != vecInt.end(); iter++)
{
cout<<*iter<<endl;
}
return 0;
}
三、迭代器
1、双向迭代器和随机访问迭代器
双向迭代器支持的操作:
it++,++it,it--,--it,*it,itA=itB,itA==itB,itA!=itB
支持双向迭代器的容器有:list,set,multiset,map,multimap
随机访问迭代器支持的操作:
在双向迭代器的操作基础上增加:
it+=i,it-=i,it[i],itA<itB,itA<=itB,itA>itB,itA>=itB
支持随机访问迭代器的容器有:vector,deque
ps:++it的效率高于it++,因为前者返回的是引用,后者返回的是值。
2、vector与迭代器的配合使用
vec.begin();//容器中第一个元素的迭代器
vec.end();//容器中最后元素的后面一个元素的迭代器
正向迭代器:
vector<int>::iterator iter;
for(iter = vecInt.begin(); iter != vecInt.end(); iter++)
{
cout<<*iter<<" ";
}
反向迭代器:
vector<int>::reverse_iterator riter;
for(riter = vecInt.rbegin(); riter != vecInt.rend(); riter++)
{
cout<<*riter<<" ";
}