首先是一个无关紧要的评论
您可以将访问器函数更改为更简单的形式
return unitCode == uCode;
现在我们来这里是为了什么
你最好寻找元素的位置而不是它的索引。从索引获取元素是 O(n) 操作,而从元素位置获取元素是 O(1) 操作。所以,有了 STL 和 boost::bind() 的一点帮助:
#include <algorithm>
#include <boost/bind.hpp>
// ...
std::string uCode("uCode to search for");
std::list<Unit*>::iterator pos = std::find_if(unitCollection.begin(),
unitCollection.end(),
boost::bind(&Unit::isUnit,
_1, uCode));
STL 确实有std::mem_fun(),与std::bind2nd() 一起会产生相同的结果。问题是mem_fun() 仅适用于不带参数的成员函数。另一方面,boost::bind() 功能更强大,并且很好地解决了这里的问题。你应该在下一个标准中期待它,它应该在弥赛亚到来后立即出现。
但如果你没有 Boost
如果您的项目中还没有 boost,那么您真的应该安装它。如果说标准库是 C++ 的老婆,那么 Boost 就是 C++ 的小情人。他们应该都在那里,他们相处得很好。
话虽如此,您可以将函数提取到一个独立的函数对象中,正如 Peter 已经提到的:
struct has_uCode {
has_uCode(cont std::string& uc) : uc(uc) { }
bool operator()(Unit* u) const { return u->isUnit(uc); }
private:
std::string uc;
};
然后,您可以像这样拨打std::find_if():
std::list<Unit*>::iterator pos = std::find_if(unitCollection.begin(),
unitCollection.end(),
has_uCode("this and that"));
还有一点性能方面的考虑
还有一件事:我不知道 uCode 的样子,但如果它们很大,那么您可以通过维护这些字符串的散列来加快处理速度,这样在您的搜索谓词中您只比较散列。哈希可能是常规整数:比较整数非常快。
还有一件事:如果您经常运行此搜索过程,您可能还会考虑更改容器类型,因为这确实是一个昂贵的过程:按照列表长度的顺序。