我在双端队列中有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 =

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

我敢肯定还有一种更明智的方法,但是我不知道怎么做?

===============>>#1 票数:3 已采纳

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

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

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

===============>>#2 票数: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而不是shared,所以我不确定您的要求是什么。如果您使用的是较旧的平台,则boost shared_ptr也可以使用)

===============>>#3 票数: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
}

  ask by riot_starter translate from so

未解决问题?本站智能推荐:

1回复

在C ++ 11中从std :: deque移动一个元素

我们知道std::deque::front()返回对deque的第一个元素的引用。 我想知道这段代码是否总是安全的: 我已经尝试使用gcc-4.9这个代码并且有效,但我不知道我们是否可以认为这个代码是安全的!
2回复

优化std :: deque中的搜索

我正在做一个具有不同类型对象的程序,它们都是虚拟类的子代。 我正在这样做寻找多态的优点,允许我从管理器类调用所有对象的某个方法,而不检查它的特定类型的对象。 关键是不同类型的对象有时需要获取某种类型的对象列表。 在那一刻,我的经理类循环考虑所有对象并检查对象的类型。 它创建一个列
2回复

std :: deque - 下标超出范围

我正在为基于AMX的SA-MP编写一个插件,并且发生了一个恼人的问题。 我正在使用deque和函数来查找和删除元素。 (如下所示) 每当我调用DestroyTimer()时,我都会收到此错误: 我可以添加元素,读取和修改它们,但我无法删除它们。 谢谢。
1回复

std :: deque真的是线程安全的吗?

我知道这些书对std :: deque的中度线程安全有什么看法,但我的经验证明不是这样。 我正在使用VS 2010.至少有两个线程(可能是N个线程但添加线程只会使问题更快发生)每个线程运行相同的代码。 每个线程包含相同的代码,但是指向包含deque的结构的唯一实例的指针被传递给每个线程,因此
2回复

我可以在c ++ 11中的std :: deque上使用std :: max_element()吗?

我可以编写像std::max_element(std::begin(my_deque), std::end(my_deque))吗? 我问,因为我知道deque不能保证连续存储,所以我想知道当使用涉及像std::max_element这样的迭代器的函数时它是否会正常运行? 非常感谢你
2回复

C ++ Std队列和矢量性能

我最近一直在处理图表,我正在寻找从图表中返回路径。 该路径需要作为std向量返回,该向量包含首先具有起始节点的所有节点。 我一直在寻找两个选项: - 使用慢向量插入方法在向量的前面添加节点 - 使用deque将节点添加到前面(push_front),这要快得多。 然后使用std ::
6回复

为什么在一个大std :: list上这么慢地迭代?

如标题所示,我遇到了一个我的程序遇到问题,在该程序中我将std :: list用作堆栈,并且还遍历了列表的所有元素。 当列表很大时,该程序花费的时间太长了。 有人对此有很好的解释吗? 它是某些堆栈/缓存行为吗? (通过将列表更改为std :: vector和std :: dequ
1回复

在C ++中替换集合的最佳方法

我必须重构看起来像这样的旧代码(我不是一个非常熟练的C ++编码器) 基本上我想迭代集合的元素并获取和设置/更新它们的一些属性。 我不能使用原始集,因为我在此线程中描述的问题中运行该对象具有与成员函数对象类型不兼容的类型限定符是const 我正在考虑用dequeue替换set(它
1回复

访问std :: deque中的特定元素

我需要访问双端队列“ queArr”中特定位置的元素。 从这个元素,它是“ plane”类的对象,我需要调用成员函数getTime,该函数返回私有成员时间。 问题是我不知道如何访问元素,因为它可能在que中的任何位置。 我尝试使用[]运算符和que.at()函数,但均未成功。 这些是
2回复

元素在std :: vector和std :: deque中的连续存储位置

对于std::vector和std::deque ,“元素的连续存储位置”是什么意思? 根据cplusplus.com ,可以保证std::vector (不保证std::deque )将元素存储在连续的存储位置中。 但是如何在代码中看到它呢? 两者都有一个随机访问迭代器,因此在两种情况下