C++ C++;在向量中使用不可指定的对象

C++ C++;在向量中使用不可指定的对象,c++,vector,reference,containers,C++,Vector,Reference,Containers,我想在std::vector中存储对象列表,但这些对象包含引用,无法分配给。但是,我可以复制并构造对象 我能想到的唯一选择是使用指针包装对象,并在需要分配对象时重新放置指针,但这种方法的语法会显著降低可读性,特别是在使用迭代器时,我更喜欢另一种方法 不起作用: std::vector<MyObject> myVector; //fill the vector //... myVector[1] = object1; std::vector myVector; //填充向量 //..

我想在
std::vector
中存储对象列表,但这些对象包含引用,无法分配给。但是,我可以复制并构造对象

我能想到的唯一选择是使用指针包装对象,并在需要分配对象时重新放置指针,但这种方法的语法会显著降低可读性,特别是在使用迭代器时,我更喜欢另一种方法

不起作用:

std::vector<MyObject> myVector;
//fill the vector
//...
myVector[1] = object1;
std::vector myVector;
//填充向量
//...
myVector[1]=object1;
智能指针牺牲了可读性:

std::vector<std::unique_ptr<MyObject>> ptrVector;
//fill the vector
//...
ptrVector[1] = std::unique_ptr<MyObject>(new MyObject(object1));
std::vector ptrVector;
//填充向量
//...
ptrVector[1]=std::uniqueptr(新的MyObject(object1));

std::vector
中是否有其他方法可以使用不可分配的对象?

为什么不让“MyObject”可分配?您可以重写运算符“=”,因此“myVector[1]=object1”将是可行的。

这不是对您的问题的直接回答,因为我无法提供一个替代
std::vector
的方法,也无法提供一种允许您执行所需操作的其他使用方法

但是,如果可以修改
MyObject
的定义,则可以选择对其进行更改,以使其使用
std::reference\u wrapper
而不是常规引用。这将允许
MyObject
可分配

例如:

#include <vector>
#include <functional>
#include <iostream>

struct MyObject
{
  //int &_i;
  std::reference_wrapper<int> _i;
  MyObject(int &i):_i(i) {}
};


int main() {
  std::vector<MyObject> vec;
  int i1 = 3;
  int i2 = 4;
  MyObject c1(i1);
  MyObject c2(i2);

  /* Storing object. */
  vec.push_back(c1);

  /* Assigning to it. */
  vec[0] = c2;

  /* Confirming that it's the correct object now. */
  for (const MyObject &it : vec)
    std::cout << it._i << std::endl;

  /* Modifying the value of its internal reference. */
  vec[0]._i.get() = 5;
  /* Confirming that the original int changed value indeed. */
  std::cout << "i2 == " << i2 << std::endl;

  return 0;
}

假设C++11,使用
std::reference\u wrapper
而不是传统的引用会是一个解决方案吗?我认为您不需要在最后一行代码中使用
std::move
,因为
std::unique\u ptr(…)
是一个右值。@DavidRodríguez dribeas噢,是的,修正了问题中的问题。相关的问题和答案提到
std::list
作为替代方案(当然是以O(n)插入复杂性为代价):@jogojapan此问题与创建新对象相关。当我将一个对象指定给一个向量时,我正在将信息复制到现有对象中,这在逻辑上与使用该信息创建一个新对象并给该向量一个新对象的引用相同。因为
MyObject
包含一个引用作为成员。我刚刚意识到该对象包含一个
const
引用,因此,更改对包装器的引用在这里没有帮助。我已经编辑了我的问题以反映变化。在这种情况下,您可以使用
std::reference\u包装器
(并用您正在使用的类型替换
int
)。哦,哈哈,当我测试这个时,我使用了
const std::reference\u包装器
。我又把问题复述了一遍。谢谢你的帮助!如果我使用的
const
变量不是引用,例如
const int
,那么这个方法不会工作,是吗?在库的新版本中,我已经按照您的建议将const引用更改为引用包装。引用的主要用途是作为函数参数,所以我几乎不需要修改任何代码来说明这一点。谢谢你的建议!
struct MyObject
{
  std::reference_wrapper<const int> _i;
  MyObject(const int &i):_i(i) {}
};