【问题标题】:Accessing vector of structures访问结构向量
【发布时间】:2019-10-08 15:16:17
【问题描述】:

我在访问另一个结构中的结构向量时遇到问题。可能有些东西我看不到...

让我们有这样的结构:

struct Struct_1 {
  int Id;
  int Mode;
  string Name;
};

另一个类似这样的结构:

struct Record {
  int Id;
  int StructId;
  string Name;
  vector<Struct_1> structHolder;
};

现在我需要填写一些结构记录

int recordCount = 10;
vector<Record> recordVector(recordCount);
for(int i = 0; i < recordVector.size(); ++i){
   recordVector[i].Id = ...
   recordVector[i].StructId = ...
   recordVector[i].Name = ...
   // till now it is ok 
   recordVector[i].structHolder[i].Id = ..
   recordVector[i].structHolder[i].Mode = ..
   // and here it fails when i access vector

}

当我尝试填充 structHolder 的数据时,它失败并显示“C++ 向量下标超出范围”有人知道问题出在哪里吗? 非常感谢!

【问题讨论】:

  • 记录数!= structHolders 数。您必须使用单独的循环迭代 structHolder 向量。
  • Record 的默认构造函数会将structHolder 设置为空向量。要么写一个构造函数,.resize() 在使用向量之前,要么使用structHolder.push_back(...)
  • 到底是什么i recordVector.size() 应该是 for 循环的条件子句?

标签: c++ vector struct


【解决方案1】:

对嵌套std::vector 的索引仅访问该向量中的现有元素。它不能添加一个新的。您还需要初始化数据成员structHolder,例如

for(int i = 0; i recordVector.size(); ++i){
   // as before...
   recordVector[i].structHolder.resize(42);

   // Now you can access the 42 Struct_1 instances via indexing:

   rectorVector[i].structHolder[0].Id = 10;
   // ...
}

【讨论】:

    【解决方案2】:

    recordVector[i].structHolder 是一个空的std::vector。 所以你不能访问它的任何项目。

    一种解决方案是将Struct_1push_back 的实例填充到您的向量中

    Struct_1 myStruct;
    myStruct.Id = 1
    recordVector[i].structHolder.push_back(myStruct);
    

    【讨论】:

      【解决方案3】:

      您需要先填充矢量,然后才能访问它。你可以用resize 来做,例如:

      vector<Record> recordVector(10);
      int main() {
          for (int i = 0; i < recordVector.size(); ++i) {
              recordVector[i].structHolder.resize(5);
              for (int j = 0; j < recordVector[i].structHolder.size(); j++) {
                  recordVector[i].structHolder[j].Id = j;
                  recordVector[i].structHolder[j].Mode = 1;
              }
          }
      }
      

      在这个例子中,每个recordVector 在其structHolder 中都有五个Struct_1,我们用一个嵌套循环填充它们。

      【讨论】:

      • 谢谢!帮了我很多。我发现缺少一个循环,但我忘记在第二个循环之前调整 的大小。
      猜你喜欢
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2018-04-04
      • 1970-01-01
      • 2010-11-25
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多