C++ 国际热核聚变实验堆交换能专业化吗?
如果我有一个容器C++ 国际热核聚变实验堆交换能专业化吗?,c++,algorithm,vector,c++11,containers,C++,Algorithm,Vector,C++11,Containers,如果我有一个容器std::vector items,我可以创建一个IndirectIterator,它包装std::vector::iterator,并允许迭代T 我可以专门为间接迭代器进行iter\u交换,以通过指针制作标准算法(如std::sort)交换项吗 i、 例如,如果我写以下内容,它会对标准算法产生任何影响吗 namespace some_namespace { template <typename IterT> class IndirectIterato
std::vector items
,我可以创建一个IndirectIterator
,它包装std::vector::iterator
,并允许迭代T
我可以专门为间接迭代器进行iter\u交换
,以通过指针制作标准算法(如std::sort
)交换项吗
i、 例如,如果我写以下内容,它会对标准算法产生任何影响吗
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());
}
}
名称空间某些名称空间
{
模板
类间接迭代器
{
IterT m_基地;
公众:
typedef IterT base_迭代器;
typedef/*…*/引用;
/* ... */
引用运算符*()常量{**m_base;}
const base_迭代器&base()const{return m_base;}
base_迭代器&base(){return m_base;}
};
模板
无效iter_交换(间接迭代器&a、间接迭代器&b)
{
使用std::iter_交换;
iter_交换(a.base(),b.base());
}
}
这种专业化的好处是它交换指针,而不是完整的T实例,因此速度更快(可能)。据我所知,iter\u交换
仅用于std::reverse
,它没有提到任何依赖于参数的查找:它总是使用std::iter\u交换
。而且,由于不允许在std
命名空间中重载函数,因此您运气不好
我可以专门为间接迭代器制作标准的iter\u swap
吗
算法(如std::sort
)按指针交换项目
你总是可以让你的超负荷/专业化。但是,您的问题是是否可以在名称空间std
内专门化iter\u swap
我认为,从标准来看,答案并不明确。
我发现在某些情况下,我必须在std
内部定义一个特殊的iter\u交换
,以便std::sort
使用它。在gcc标准库中,std::sort
使用限定的std::iter\u交换
这可能是std::sort
中的一个缺陷。
IMOstd::sort
应调用非限定的swap\u iter
i、 例如,如果我写下以下内容,它会对标准产生任何影响吗
算法
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());
}
}
不在GCC中(至少),因为标准算法使用合格的std::iter\u swap
(bug?)
我认为标准对此并不清楚。您可以重新打开std
名称空间并专门化std
中的模板,只要您专门化它们以用于用户定义的类型。在您的情况下,您实际上可以专门化std::iter\u swap
,只需确保您是在std
命名空间中进行的,而不是在您自己的命名空间中(如您的示例所示)。它不是很优雅,但它是允许的。检查libc++中的一些标题这看起来是正确的,尽管有点令人失望。我想我可以用一个自定义的引用类来实现它,但我不确定仅仅为了使swap更好而这样做是否值得。至少在C++11中,std::sort
使用std::iter\u swap
。(我必须专门化/定义std::iter_swap
以使特定的迭代器与std::sort
一起工作。您仍然可以专门化std
命名空间中的模板,只要它们专门用于用户定义的参数。此外,一个实现在一个pl中只使用std::iter_swap
ace并不意味着它是唯一被使用的地方,也不意味着它的使用是完全正确的…@AnT,只要你保持与非专业版本相同的语义。