C ++:映射结构中的结构指针

时间:2018-10-27 00:05:27

标签: c++ data-structures

我声明了这样的结构以及以下数据结构

struct piece{
  int start, height, end;

  piece(int a, int b, int c){
    start = a;  height = b; end = c;
  }

};

vector<piece> piecesTog;
map <int,piece*> data;

然后,当我阅读元素时,我会这样做:

while(scanf("%d %d %d", &aux1, &aux2, &aux3) != EOF){
    piecesTog.push_back( piece(aux1, aux2, aux3) );
    data[a] = data[c] = &piecesTog[tam];
}

好吧,到目前为止,我还没有遇到任何问题。 但是,在程序的后面,我必须使用piece *部分,为此,我使用了这样的迭代器

 for(map< int, piecesTog* >::iterator it = data.begin(); it != data.end(); it++){
    piece* aux = it->second;
    ...
 }

我想访问it-> second指向的结构,但是我尝试了一切,但没有任何效果。

我打印了它的内存地址-> second和&piecesTog [tam],它们是相同的,但是当我(* aux).height或it-> second-> height时,它们给出的数字完全是疯狂的,可能有些垃圾。

我不知道为什么会这样。

如果有人对如何解决有任何想法,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

while(scanf("%d %d %d", &aux1, &aux2, &aux3) != EOF){
    piecesTog.push_back( piece(aux1, aux2, aux3) );
    data[a] = data[c] = &piecesTog[tam];
}

几乎可以肯定没有遵循Iterator invalidation rules

piecesTog.push_back( piece(aux1, aux2, aux3) );

可以触发调整大小,通常会创建一个新的数据存储区,将元素从旧的数据存储区复制到新的存储区,然后删除旧的数据存储区,而指针将被缓存

data[a] = data[c] = &piecesTog[tam];

晃来晃去。当您将来使用这些指针时,Ka-Blammo!不确定的行为,如果幸运的话,还可以轻松识别崩溃。

提供的信息不足以提供确定的解决方案,但以下是一些替代方法(按吸引力的顺序):

如果您提前知道将piece放入piecesTog的数量,则可以reserve存储,而无需调整vector的大小。 / p>

如果仅将元素添加到vector的末尾,并且从未删除任何元素,则可以存储元素的索引,而不是指向它们的指针。如果顺序从不改变,则无论添加多少项目,索引都将始终引用正确的元素。

如果可能的话,重写阅读器以将所有pieces加载到piecesTog中,然后构建地图。

以上所有选项均假定piecesTog一次性全部组装,然后单独放置。如果插入的格式更自由,对结构进行排序或删除元素,则需要使用具有更有利的无效规则的数据结构,例如std::list