STL的算法函数,c++ stl算法
最近用了STL的泛型算法remove_if。我读了MSDN好几遍,但我就是不明白这个功能的真正含义。嗯,其实我的英语老师教体育-!后来看了STL源代码,发现了其中的玄机。在这里,我可以做一个笔记来打动自己。我还是会用MSDN的例子来说明。
int larger 6(int value){
返回值
移除了满足大于6的元素的“cout”向量v1是\ n(;
for(ITER 1=v1 . begin();Iter1!=v1 . end();Iter1)
cout * ITER 1“”;
cout)). endl
//要更改序列大小,请使用erase
v1.erase (new_end,v1 . end());
cout Vector v1已调整大小的元素满足移除的更大值6是\ n(;
for(ITER 1=v1 . begin();Iter1!=v1 . end();Iter1)
cout * ITER 1“”;
cout)). endl
}
Remove_if有三个参数,前两个参数是需要操作的迭代器区间,第三个参数是函数指针,它的作用是作为移除哪些元素的选择条件。看remove_if的源代码,我们知道它首先调用一个find_if算法,找到第一个满足移除条件的元素,并返回那个元素的迭代器。然后调用unchecked_remove_copy_if算法函数,类似remove_copy_if,但实际上是内部调用remove_copy_if。
下面是伪代码:
remove_if(itr_begin,itr_end,funPtr)
itr_find=find_if(itr_begin,itr_end,funPtr);
itr _ begin=itr _ find
unchecked _ remove _ copy _ if(itr_begin,itr_end,itr _ begin,funPtr);
}
下面给出了remove_copy_if的伪代码实现。
remove_copy_if(_First,_Last,_Dest,funPtr)
for(;_第一!=_ Last_First)
如果(!funPtr(*_First))
* _ Dest=* _ First
return(_ Dest);
}
从源代码的实现可以看出,它是从第一个满足移除条件的元素开始遍历到容器的末尾。当检查到一个元素不满足移除条件时,它将被第一个满足移除条件的元素替换。
以下是示例代码中remove_copy_if每次循环的结果:
(好像排版有问题。当执行第一个循环时,迭代器D指向元素7,F指向元素9。)
1 1,7,9,2,0,7,7,3,4,6,8,5结束
2 1,2,9,2,0,7,7,3,4,6,8,5结束
3 1,2,0,2,0,7,7,3,4,6,8,5结束
4 1,2,0,2,0,7,7,3,4,6,8,5结束
5 1,2,0,2,0,7,7,3,4,6,8,5结束
6 1,2,0,2,0,7,7,3,4,6,8,5结束
7 1,2,0,3,0,7,7,3,4,6,8,5结束
科技新词汇
8 1,2,0,3,4,7,7,3,4,6,8,5结束
9 1,2,0,3,4,6,7,3,4,6,8,5结束
科技新词汇
10 1,2,0,3,4,6,7,3,4,6,8,5结束
科技新词汇
11 1,2,0,3,4,6,5,3,4,6,8,5结束
科技新词汇
在11个循环遍历结束时,容器v1中的元素现在是步骤11中的元素的顺序。1,2,0,3,4,6,5后面的元素是我在看源代码之前很困惑的。知道了源代码之后,我清楚地知道了下面的元素(3,4,6,8,5)是从哪里来的。Remove_if不改变容器的大小。它的返回值是一个迭代器,指向所有满足移除条件的元素的第一个元素,也就是这里的第二个3。一般remove_if和容器的erase方法一起使用,所以我调用v1.erase(newEnd,v1.end)方法后,v1中剩余的元素排列如下:1,2,0,3,4。
与remove_if算法类似的函数有:
remove方法的第三个参数传入一个常数,这意味着要移除指定的常数值。
remove_copy_if方法可以通过第三个参数将移除的结果转移到另一个容器中。当然,这个容器必须足够大,才能装下一个元素,否则后果会很严重。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。