如果我有一个容器std::vector<T*> items
,我可以创建IndirectIterator
包裹std::vector<T*>::iterator
并允许迭代T
而不是T*
我可以将iter_swap
IndirectIterator
专门用于通过指针制作标准算法(例如std::sort
)交换项吗?
即,如果我写下以下内容,它会对标准算法产生影响吗?
namespace some_namespace
{
template <typename IterT>
class IndirectIterator
{
IterT m_base;
public:
typedef IterT base_iterator;
typedef /* ... */ reference;
/* ... */
reference operator*() const { **m_base; }
const base_iterator& base() const { return m_base; }
base_iterator& base() { return m_base; }
};
template <typename T>
void iter_swap(IndirectIterator<T>& a, IndirectIterator<T>& b)
{
using std::iter_swap;
iter_swap(a.base(), b.base());
}
}
这种专业化的好处是它交换指针而不是完整的T实例,所以它更快(可能)。
答案 0 :(得分:2)
据我所知,iter_swap
仅用于std::reverse
,并未提及任何类型的依赖于参数的查找:它始终使用std::iter_swap
。并且由于不允许在std
命名空间中重载函数,所以运气不好。
答案 1 :(得分:1)
我可以将
class Class { var label: UILabel! init() { ... label = UILabel() ... } }
专门用于class Class { var label = UILabel() init() { … } }
制定标准 算法(如iter_swap
)通过指针交换项目?
您可以随时进行超载/专业化。不过,您的问题是,您是否可以在1>}命名空间IndirectIterator
中专门设置std::sort
。
我认为答案在标准中尚不清楚。
我发现在某些情况下,我必须在iter_swap
内定义一个特殊的std
,以便iter_swap
使用它。在gcc std中,lib std
使用限定的std::sort
。
这可能是std::sort
中的缺陷。
IMO std::iter_swap
应调用不合格的std::sort
。
即,如果我写下以下内容,它会对标准产生任何影响 算法
不在GCC(至少),因为标准算法使用合格的std::sort
(错误?)
我不认为标准是明确的。
答案 2 :(得分:1)
只要您将模板专门用于用户定义的类型,就可以重新打开std
命名空间并专门化std
内的模板。在您的情况下,您实际上可以为您的目的专门化std::iter_swap
,只需确保您在std
命名空间中执行此操作,而不是在您自己的命名空间中(如您的示例中所示)。它不是很优雅,但它是允许的。