我想将向量的指针移动到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类对象,但我不知道应该怎么做。有人可以帮助我吗?
答案 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. 强>