一,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):在容器操作中可以对矢量类的点积运算。很鸡肋的算法。