例:
#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; }
#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采用模版类实现,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对象间拷贝正常。
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
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;
vec.at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
vec[idx];//返回索引idx所指的数据。
vec.front();//返回最前一个值,等价vec.at(0)
vec.back();//返回最后一个值
vector.size();//容器中元素的个数
vector.empty();//判断容器是否为空
vector.resize(num);//重新指定容器的长度为:num。
//长度变长,默认用0填充,长度变短,裁剪后面的元素
vector.resize(num, elem);//用指定元素填充
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());
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);
将vec1和vec2元素互换
例:vec1.swap(vec2);//或者swap(vec1, vec2);
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; }
双向迭代器支持的操作:
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++,因为前者返回的是引用,后者返回的是值。
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<<" ";
}