访问结构向量

时间:2019-05-22 07:38:47

标签: c++

我在访问另一个结构中的结构向量时遇到问题。可能有些事我无法解决...

让我们有这样的结构:

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 ++向量下标超出范围”。有人知道哪里出了问题吗? 非常感谢!

3 个答案:

答案 0 :(得分:5)

recordVector[i].structHolder是空的std::vector。 因此,您无法访问其中的任何项目。

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

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

答案 1 :(得分:2)

索引到嵌套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 :(得分:2)

您需要填写载体才能访问它。您可以使用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的{​​{1}}中都有五个Struct_1,我们用嵌套循环填充它们。