张运涛

c++

   :: 首页 :: 联系 :: 聚合  :: 管理

常用链接

留言簿(4)

搜索

  •  

最新评论

一,STL中的有无改变算法和有改变算法:

无改变算法有:1,find 这个算法是最常用的无改变查找算法, 线性时间特性O(N),用于在未排序的勇气元素序列中查找元素。只在元素数量较少的情况下使用。例如:可以搜索游戏玩家列表或者搜索本地又似玩家已经建立的不同人物,但是尽量要避免使用这一算法在游戏中搜索指定的游戏实体。

代码如:

             list<string> PlayerName

            if(find(playerNames.begin(),playerNames.end(),wantedName)==playerNames.end())

              {

               // 查到Name后,做其他事。。。。

              }

           2 for_each

   这个算法有时可以代替for循环 

          for_each(entities.begin(),entities.end(),Update);

   原来的:

        entityContainer::iterator it;

         for(it= entities.begin(); it!=entities.end(); ++it){

         GameEntity& entity=*it;

          Entity.Update(); 

可以对比下 for_each很简练。

       3 count算法:

  如果只想知道容器里容纳多少个元素,那么应该使用的成员函数是SIZE(),count算法不只计算容器中的所有元素,而且可以计算某一特定值相匹配的所有元素。其最有用的版本可能是它的谓词变量版本:count_if.

例如:

     isEnemyNearby是计算靠近游戏者的实体的函数

int  nNearbyEnemies=count_if(entity.begin(), entity.end(), isEnemyNearby); //可以计算靠近游戏者的实体个数

4 其他无改变算法有 adjacent_find, mismatch,equal,search 但是用的不是太频繁。

有改变算法:1 copy

这个算法是把一个容器里的元素拷贝到另一个容器中,例如

      list<int> newScores;

     copy(highScores.begin(),  highScores.begin()+10,newScores.begin());

  拷贝highScors中的前十个元素到newScores中。

2 ,swap_ranges

类似COPY算法,用以确定序列范围,实现是交换两个序列之间的元素。

3,remove

这个算法是STL中最有用的同时也是最不直观的算法之一,remove调用没有删除任何元素,

例如:

vector<int> test;

test.push_back(3);

test.push_back(1);

test.push_back(4);

test.push_back(1);

test.push_back(5);

test.push_back(3);

test.push_back(1);

test.push_back(8);

remove(test.begin(),test.end(),1);

上面对其调用将返回test.begin()+5,因为算法从序列中移出了3个元素,现在序列中前5个元素是3,4,5,3,8。剩下的三个1没有被删除,标准的说是没有被定义,因此可以是任何内容。实际上,后3个元素通常是保持了初始序列中的内容;他们没有进行任何改动,但是可以明确地讲,他们不是已经删除的3个元素。 可能有点混乱,但是,一句话,Remove不会从容器中移出任何东西,,元素的数量仍然是不变的。

另外,删除元素的函数是erase函数。

4,改变顺序算法:

1),reverse(first,last)  颠倒序列中所有元素的次序。

2),rotate(first,middle,last): 旋转序列中的所有元素。在序列中元素会被移动,直到中间元素到达第一位置,并且被移出的元素附加到序列的尾部。

3),random_shuffle(first,last):   这个在扑克牌中很常用 ,打乱序列中所有的元素排列顺序。

5,其他的有改变算法

transform,replace,fill,generate, unique,partition.

 

二,排序算法

在游戏编程中,白须是一种重要的操作,其发生的频率远远超出我们的想象。STL中的sort算法不稳定。但是在大多数游戏开发中,不是个问题。但是对要求较高的要求稳定的分类时,应该使用stable_sort算法,不过其时间复杂性为

O(N Ln( N*N))。

另外,有时有数量非常多的元素,但是关心的是最前面的X个元素的排序。这种情况下,就可以使用partial_sort算法,

其时间特性为O(N ln X).

三,通用数值算法

accumulate(first,last,init) 该算法对给定范围内的所有元素进行求和。求和初始值有init设置。

partial_sum(first,last,output):用于对一定范围内的元素部分求和。

adjacent_diference(first,last,output) 计算相邻元素对之间的差值。

inner_product(first1,last2,first2,init):在容器操作中可以对矢量类的点积运算。很鸡肋的算法。

 

posted on 2010-04-05 18:41 张运涛 阅读(440) 评论(0)  编辑 收藏 引用 所属分类: 算法学习

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理