在C ++中将向量指针移动到派生类的向量?

时间:2017-08-19 09:09:59

标签: c++ class c++11 vector move

我想将向量的指针移动到A对象的向量(this)。我想这样做,因为我使用我的帮助向量(对于mergesort),我想要原始向量中的帮助向量的值。然而,我只想使用1个操作(因此应该通过移动,不复制元素来完成)。

这是我使用的代码:

template<class T>
class A:public vector<T> {
    public:
        void fillAndMove();

        vector<T> help;
}

template<class T>
void A<T>:fillAndMove() {
    // Fill a help array with random values
    help.resize(2);
    help[0] = 5;
    help[1] = 3;

    // This line doesn't work
    *this = move(help);
}

我收到以下错误:

no match for 'operator=' (operand types are 'A<int>' and 'std::remove_reference<std::vector<int, std::allocator<int> >&>::type {aka std::vector<int, std::allocator<int> >}')

我认为问题是需要将帮助向量转换为A类对象,但我不知道应该怎么做。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

您想要实现移动分配运算符,它将在O(1)中执行。

template<class T>
class A :public vector<T> {
public:
    void fillAndMove();

    vector<T> help;

    A & operator=(std::vector<T> && rhs)
    {
        static_cast<vector<T>&>(*this) = move(rhs);
        return *this;
    }
};

它也允许将常规向量分配给A类,这样可以保持help向量不变,因此您可能需要创建此运算符private并为A类实现移动赋值运算符公共

    test = std::vector<int>{ 5,6 }; // possible - should assigment operator be private?

此代码无法使用:

template<class T>
class A :public vector<T> {
public:
    void fillAndMove();

    vector<T> help;

    A & operator=(A && rhs)
    {
        // Move as you want it here, probably like this:
        help = std::move(rhs.help);
        static_cast<vector<T>&>(*this) = move(rhs);
        return *this;
    }

private:
    A & operator=(std::vector<T> && rhs)
    {
        static_cast<vector<T>&>(*this) = move(rhs);
        return *this;
    }
};

此外,在执行此操作时,您还应该实现移动构造函数。

答案 1 :(得分:0)

如果要以这种方式使用

,则必须重载运算符赋值
A & operator=(const std::vector<T> & rhs)
{
    for(auto it : help)
    {
        this->push_back(it);
    }
    return *this;
}

<强> Working example here.