以map容器为例:
第一:前置++和后置++的区别
1.使用typedef定义map容器的迭代器 typedef map<UINT,string>::const_iterator CIT;
2.定义迭代器对象CIT cit;
3.定义map容器map<UINT,string> clientInfoMap;
4.遍历map容器里的内容(cit->first:获取map容器的关键字,cit->second:获取map容器的关键值):
for(cit=clientInfoMap.begin();cit!=clientInfoMap.end();cit++)
{
UINT clientSocket=cit->first;
}
分析:cit迭代器的前置++和后置++区别;cit在循环中遍历次数相同,但是效率不同,前置++返回的是引用,后置++先返回一个临时对象再进行自加,也就是说
后置++在循环时每遍历一个元素,就创建并销毁一个无用的临时对象,造成了不必要的程序效率的损失。因此在用迭代器进行遍历时请尽量使用前置++操作
如下:
for(cit=clientInfoMap.begin();cit!=clientInfoMap.end();++cit)
{
UINT clientSocket=cit->first;
}
在程序调试的时候,F11跟踪上面的++cit代码可以定位到容器的内部实现:
前置++在容器中的内部实现
_Myiter& operator++()
{ // preincrement
++*(_Mybase *)this;
return (*this);
}
后置++在容器中的内部实现(会创建一个临时的对象_Tmp)
_Myiter operator++(int)
{ // postincrement
_Myiter _Tmp = *this;
++*this;
return (_Tmp);
}
第二:容器返回的迭代器方法:begin() 和end()讲解
1.begin()是容器里所有元素的首个元素的指针(实际就是一个地址)
2.end()是容器里所有元素的末尾的指针再加1,也就是指向最后一个元素的下一个位置
这里这样设计是合理的,两点:
2.1 使用for循环查找容器里的元素的时候可以使用:自增的迭代器cit 不等于 末尾迭代器clientInfoMap.end() 来判断容器里的所有元素全部遍历完成
for(cit=clientInfoMap.begin();cit!=clientInfoMap.end();++cit)
{
UINT clientSocket=cit->first;
}
2.2 还可以使用 第一个元素迭代器clientInfoMap.begin() 等于 末尾迭代器clientInfoMap.end() 来判断容器里没有元素
if(clientInfoMap.begin()==clientInfoMap.end())
{
priintf("clientInfoMap容器没有元素!");
}