Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 国际热核聚变实验堆交换能专业化吗?_C++_Algorithm_Vector_C++11_Containers - Fatal编程技术网

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
中的一个缺陷。 IMO
std::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,只要你保持与非专业版本相同的语义。