Golang版本的remove_if函数实现

本文 http://blog.codeg.cn/2016/02/14/golang-remove_if/ 是作者zieckey在研究和学习相关内容时所做的笔记,欢迎广大朋友指正和交流! 版权所有,欢迎转载和分享,但请保留此段声明。

C++中的std::remove_if函数实现了一个算法,可以将一个容器中的元素按照一定的规则进行删除,但Go语言中却没有类似的函数。代码其实很简单,如下:

func RemoveIf(s string, f func(rune) bool) string {
	runes := []rune(s)
	result := 0
	for i, r := range runes  {
		if !f(r) {
			runes[result] = runes[i]
			result++
		}
	}

	return string(runes[0:result])
}

上述算法是参考C++标准库中的实现(bits/stl_algo.h:remove_if),但比C++的效率低,因为多了两次转换(string[]rune互相转换两次)。

进一步思考:这两次转换不知道是否可以通过其他方式节省掉?类似于C++的实现,就地删除(并没有新开辟内存空间)。

上述源码放到这里了: https://github.com/zieckey/gocom/tree/master/tstrings

必须要吐槽一下Go语言没有泛型,如果要针对[]byte就又得要重复实现一遍类似的代码。