人气 225

[游戏程序] [转帖]关于list和vector的一点点试验 [复制链接]

九艺网 2017-3-10 17:01:51

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
关于list和vector的一点点试验

在我的游戏中存在一个Actor_t的类
他的实例是一个角色,角色维护它自己的任务(Active_t)数组
我选择list(链表)作为动态数组,因为考虑到经常要删除任务
所以list快一些。
角色update时候需要找到这里已经执行完成的任务,并移出数组
所以我们要遍历数组 删除元素。
但因为list是强迭代器,就是在更改数组时候迭代器仍然有效
vector是弱迭代器,在更改数组时候,迭代器会失效
其实说白了 list是链表 vector是数组 而已
在这里写两个数组,删除数组里的偶数,看看两种容器的区别


  1. vector l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);l.push_back(6);l.push_back(7);l.push_back(8);vector< int >::iterator it;for(it=l.begin();it!=l.end();++it){        while(*it%2==0)        {                        l.erase(it);                        if(it==l.end())                        break;        }
  2.                                                                                 if(it==l.end())                        break;}
复制代码



                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图


  1. list l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);l.push_back(6);l.push_back(7);l.push_back(8);
  2.                                                         list< int >::iterator it,it2;for(it=l.begin();it!=l.end();++it){        for(it2=it;*it%1==0;it2=it)        {                        it++;                l.erase(it2);                if(it==l.end())                        break;        }
  3.                                                                         if(it==l.end())                        break;}
复制代码


最后试验了一下multimap,在同一个key下可以和list一样处理(可能就是
list实现的吧),但是不敢试验所有的key,因为如果是红黑树实现的话
删除了一个key可能树会改变,迭代器具体指哪里?

  1. multimap m;        m.insert(pair(1,1));        m.insert(pair(1,2));        m.insert(pair(1,3));        m.insert(pair(1,4));        m.insert(pair(1,5));        m.insert(pair(1,6));        m.insert(pair(1,7));        m.insert(pair(1,8));        multimap::_Pairii it;        multimap::iterator it2;        it=m.equal_range(1);        for(;it.first!=it.second;++it.first)        {                for(it2=it.first;it.first->second%2==0;it2=it.first)                {                        it.first++;
  2.                                                                                     m.erase(it2);                        if(it.first==it.second)                                break;
  3.                                                                                 }                if(it.first==it.second)                                break;        }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-27 08:49 , Processed in 0.127393 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.