STL 具有全局算法,可以在任意容器上运行,只要它们支持该算法的基本要求。例如,某些算法可能要求容器具有随机访问迭代器,例如向量而不是列表。
当容器具有比通用算法更快的执行方式时,它会提供具有相同名称的成员函数来实现相同的目标 - 就像提供自己的列表一样remove_if()
因为它可以通过在恒定时间内执行指针操作来删除元素。
我的问题是 - 是否可以/建议专门化通用算法,以便它们自动调用更高效的容器的成员函数版本?例如。有std::remove_if
call list::remove_if
内部用于列表。这已经在STL中完成了吗?
不属于以下情况remove_if
,因为语义不同。std::remove_if
实际上并没有从容器中删除任何内容,而list::remove_if
是的,所以你绝对不希望前者调用后者。
您和实现都无法从字面上专门化容器的通用算法,因为算法是采用迭代器的函数模板,而容器本身就是类模板,其迭代器类型取决于模板参数。所以为了专业化std::remove_if
一般用于list<T>::iterator
你需要一个partial专业化remove_if
,并且不存在函数模板的部分特化之类的东西。
我不记得是否允许实现重载特定迭代器类型的算法,但即使不是“官方”算法也可以调用可以重载的函数,或者它可以使用可以部分专业化的类。不幸的是,如果您编写了自己的容器,并且发现了一种使标准算法对其特别有效的方法,那么这些技术都无法帮助您。
例如,假设您有一个带有随机访问迭代器的容器,但您有一个特别有效的排序技术,可以与标准排序一起使用:也许是桶排序。那么你可能会想到放一个自由函数template <typename T> void sort(MyContainer<T>::iterator first, MyContainer<T>::iterator last)
与类位于同一名称空间中,并允许人们调用它using std::sort; sort(it1, it2);
反而std::sort(it1, it2);
。问题是,如果他们在通用代码中这样做,他们就会面临其他人编写其他容器类型将具有名为的函数的风险sort
这甚至没有对范围进行排序(毕竟,英语单词“sort”有不止一种含义)。因此基本上您不能以提高用户定义容器效率的方式对迭代器范围进行一般排序。
当代码中的差异仅取决于迭代器的类别时(例如std::distance
对于随机访问迭代器来说速度很快,否则速度很慢),这是使用称为“迭代器标签调度”的东西来完成的,这是不同容器之间存在明显效率差异的最常见情况。
如果还有任何适用于标准容器的情况(不包括结果不同或效率仅需要特定迭代器类别的情况),让我们拥有它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)