替换std :: deque const元素

时间:2014-04-19 22:15:14

标签: c++ std deque

我在deque中有const对象:

class ConstClass {
  public:
    ConstClass(int variable): variable_(variable) {}
  private:
    const int variable_;
};

std::deque<ConstClass> objects;
objects.push_back(ConstClass(1));
objects.push_back(ConstClass(2));
objects.push_back(ConstClass(3));

如何将第二个元素替换为另一个元素?

如果我尝试使用 [] = std :: replace 来做,我得到:

  

编译器无法为类'ConstClass'生成operator =

我能想到的唯一方法是在那里创建空deque, push_back()来自'objects'的所有元素(用新的元素替换第N个元素),然后 clear ()'objects'deque和 push_back()复制的元素从temp deque回到'objects'。

我确信有更明智的方法可以做到,但我不知道怎么做?

3 个答案:

答案 0 :(得分:3)

你做不到。您的容器无效,因为其元素类型必须是可复制的或可移动分配的,而您的容器不是。这不是在构造时诊断出来的,但是当您尝试执行依赖于此属性的操作时,您已经看到了导致的编译错误。

您可以通过重载副本并移动元素类型的赋值运算符来忽略const成员来使其合法且可编译,但不清楚这是否有意义。

std::unique_ptr存储到动态分配的对象,或重新考虑模型。

答案 1 :(得分:1)

问题的更多背景会有用,你怎么会在这里结束? ConstClass的目的是什么?为什么它必须是const?

假设有充分的理由你不能在没有黑客攻击的情况下解决这个问题,你可以这样做:

int main() {

   std::deque<std::shared_ptr<ConstClass>> objects;
   objects.push_back(std::make_shared<ConstClass>(1));
   objects.push_back(std::make_shared<ConstClass>(2));
   objects.push_back(std::make_shared<ConstClass>(3));

   objects[2] = std::make_shared<ConstClass>(100);
}

但肯定有更好的方法......

(您可能希望使用unique_ptr而不是共享,我不确定您的要求是什么。如果您使用的是较旧的平台,则boost shared_ptr也可以使用)

答案 2 :(得分:1)

通过指定const成员,您将禁用默认赋值运算符,并且您不应该使用技巧/黑客来绕过该限制。

您可以使用智能指针(如果您需要共享所有权,则可以使用唯一或共享),例如:

int main(){
    std::deque<std::unique_ptr<ConstClass> > objects;
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(1)));
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(2)));
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(3)));

    objects[2]=std::unique_ptr<ConstClass>(new ConstClass(4));
    // or any other usage of assignment operator, depending on the needs
}