STL基础2:模版迭代器的几点注意事项

以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容器没有元素!");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值