在构造期间引用向量中的元素

时间:2015-09-23 14:09:21

标签: c++ c++11 vector reference stdvector

在C ++中,我有一个类MyClass,它在构造过程中引用int来创建对它的内部引用。

然后我有一个班级BigClass,其中包含std::vector<int> vecInt_std::vector<MyClass> vecMyClass_BigClass的构造函数将向量vecInt_vecMyClass_的大小作为参数。在BigClass的构造函数中,我希望vecMyClass_的每个元素在其构造函数中使用vecInt_的相应元素。

我怎么能写出来?如果我可以从BigClass的构造函数的主体调用vecMyClass的构造函数,那将是这样的:

BigClass(int nbElem) :
    vecInt_(nbElem),
    vecMyClass_(nbElem)
{
    for (int i = 0; i < nbElem; ++i)
    {
        vecMyClass_[i](vecMyInt_[i]);
    }
}

但是,这里的括号当然是operator(),而不是构造函数。我写不出类似的东西:

vecMyClass_[i] = MyClass(vecMyInt_[i]);

因为MyClass包含引用而不是指针,因此无法修改引用的值。

3 个答案:

答案 0 :(得分:1)

您可以在构建它们时将vecMyClass_初始化为空向量和emplace_back元素:

BigClass(int nbElem) :
    vecInt_(nbElem),
    vecMyClass_() //empty vector
{
    vecMyClass_.reserve(nbElem); //avoid reallocations
    for (int i = 0; i < nbElem; ++i)
    {
        vecMyClass_.emplace_back(vecInt_[i]);
    }
}

答案 1 :(得分:1)

这听起来不是一个好主意。在某些时候,向vecMyInt_添加元素将导致向量扩展,即分配新内存并在那里移动元素,并释放旧内存。这意味着MyClass实例保存的引用将无效。

当然,如果您事先保留容量,并且永远不会向向量添加元素,这将不会成为问题。

答案 2 :(得分:0)

#include <vector>
#include <iostream>

struct MyClass {
  int& x;
  MyClass(int& x) : x(x) {}
};

struct BigClass {
  BigClass(std::size_t nb_elems) : ints(nb_elems) {
    my_classes.reserve(nb_elems);
    for(int& x : ints) {
      my_classes.emplace_back(x);
    }
  }

  std::vector<int> ints;
  std::vector<MyClass> my_classes;
};

int main()
{
  BigClass b{10};
  for(int& x : b.ints) {
    x = 23;
  }

  // they are all 23
  for(auto& c : b.my_classes) {
    std::cout << c.x << std::endl;
    // change them
    c.x = 24;
  }

  // they are all 24 now
  for(auto& c : b.ints) {
    std::cout << c << std::endl;
  }
  return 0;
}