Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在构造期间对向量中元素的引用 C++中,我有一个类 MyClass < />代码,在构建过程中引用了一个 int >代码>创建一个内部引用。< /P>_C++_C++11_Vector_Reference_Stdvector - Fatal编程技术网

在构造期间对向量中元素的引用 C++中,我有一个类 MyClass < />代码,在构建过程中引用了一个 int >代码>创建一个内部引用。< /P>

在构造期间对向量中元素的引用 C++中,我有一个类 MyClass < />代码,在构建过程中引用了一个 int >代码>创建一个内部引用。< /P>,c++,c++11,vector,reference,stdvector,C++,C++11,Vector,Reference,Stdvector,然后我有一个类BigClass,它包含一个std::vectorvecint\u和一个std::vectorvecmyclass\u。BigClass的构造函数将向量vecInt\u和vecMyClass\u的大小作为参数。在BigClass的构造函数中,我希望vecMyClass\uu的每个元素在其构造函数中使用vecInt\uu的相应元素 我怎么能写呢?如果我可以从BigClass构造函数的主体调用vecMyClass的构造函数,那将是这样的: BigClass(int nbElem) :

然后我有一个类
BigClass
,它包含一个
std::vectorvecint\u
和一个
std::vectorvecmyclass\u
BigClass
的构造函数将向量
vecInt\u
vecMyClass\u
的大小作为参数。在
BigClass
的构造函数中,我希望
vecMyClass\uu
的每个元素在其构造函数中使用
vecInt\uu
的相应元素

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

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

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

您可以将
vecMyClass\uu
初始化为空向量,并在构建元素时将其放置回
元素:

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]);
    }
}
BigClass(int-nbElem):
vecInt(nbElem),,
vecMyClass\//空向量
{
vecMyClass_u2;.reserve(nbElem);//避免重新分配
对于(int i=0;i
#包括
#包括
结构MyClass{
int&x;
MyClass(int&x):x(x){}
};
结构BigClass{
BigClass(标准::大小元素):整数(元素){
我的班级储备(nb要素);
用于(整数和x:整数){
我的职业。向后放置(x);
}
}
std::向量整数;
std::vector my_类;
};
int main()
{
大类b{10};
对于(整数和x:b.ints){
x=23;
}
//他们都是23岁
适用于(汽车与空调:b.my_课程){

std::cout这听起来不是个好主意。在某些情况下,向vecMyInt_uu添加元素会导致向量扩展,即分配新内存并将元素移动到那里,然后释放旧内存。这意味着MyClass实例保留的引用将无效


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

Do
vecInt\u
vecMyClass\u
必须是
const
?向量的任何元素都不会被添加/删除,但是向量中存储的值将被修改。
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]);
    }
}
#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;
}