alb*_*rto 7 c++ stl stl-algorithm c++11
为什么有些STL算法提供了额外的'_if'功能而不是重载它?
// example:
find(beg, end, val);
find_if(beg, end, pred);
Run Code Online (Sandbox Code Playgroud)
难道他们只是重载这些算法而不是制作额外的_if功能吗?
jua*_*nza 18
目前尚不清楚过载分辨率如何一般地起作用.如果容器包含谓词怎么办?
struct pred
{
bool operator()(const pred&) const;
friend bool operator==(const pred&,const pred&);
};
std::vector<pred> v;
pred p;
std::find(v.begin(), v.end(), p); // what should happen here?
Run Code Online (Sandbox Code Playgroud)
通过具有不同名称的函数来避免这种潜在的模糊性,每个名称更清楚地表达意图.
请注意,这是一个简化:没有要求std::find引用对象value_type与容器的类型相同,只是它们在相等性方面具有可比性.谓词的要求std::find_if同样是通用的.这两个函数都非常通用,这意味着模糊性可能比给定的示例更容易出现.例如,
struct foo {};
struct pred
{
bool operator()(const foo&) const;
};
bool operator==(const foo&, const pred&);
int main()
{
std::vector<foo> v;
pred p;
std::find(v.begin(), v.end(), p); // What should this do?
std::find_if(v.begin(), v.end(), p); // Here, it is clear.
}
Run Code Online (Sandbox Code Playgroud)
And*_* DM 11
这些算法提供了命名版本而不是重载版本,因为算法的两个版本都使用相同数量的参数.因此可能会出现过度模糊的情况.
为了避免任何可能的歧义,库为这些算法提供单独的命名版本,find_if就是其中之一.