【问题标题】:Replace std::deque const element替换 std::deque 常量元素
【发布时间】:2014-04-19 22:15:13
【问题描述】:

我在双端队列中有 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”生成运算符 =

我能想到的唯一方法是创建空双端队列,push_back() 那里的“对象”中的所有元素(用新元素替换第 N 个元素),然后 clear () 'objects' 双端队列和 push_back() 从临时双端队列复制的元素返回到 'objects'..

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

【问题讨论】:

  • 您的编译器不会为具有 const 成员的类生成默认赋值运算符,但您可以定义自己的...

标签: c++ std deque


【解决方案1】:

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

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

要么将std::unique_ptrs 存储到动态分配的对象中,要么重新考虑模型。

【讨论】:

    【解决方案2】:

    更多有关该问题的背景信息会很有用,您是怎么来到这里的? 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 而不是 shared,我不确定您的要求是什么。如果您使用的是旧平台,boost shared_ptr 也可以)

    【讨论】:

      【解决方案3】:

      通过指定 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
      }
      

      【讨论】:

      • 但是为什么shared_ptr?这个问题没有任何迹象表明共享所有权。
      • 另外值得使用 make_shared 实用功能。它可以更快也更安全(尽管他们错过了 c++11 规范中的 make_unique,但它应该在 C++14 中)boost.org/doc/libs/1_41_0/libs/smart_ptr/make_shared.html
      • @juanchopanza 我认为你是对的,这里可以使用 unique_ptr。已经改了答案。 @HNJSlater swap 只是演示使用赋值运算符的函数有效的示例。这可能会令人困惑,改变。感谢make_shared - 我不知道。
      猜你喜欢
      • 1970-01-01
      • 2016-09-21
      • 2013-12-05
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多