我声明了这样的结构以及以下数据结构
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时,它们给出的数字完全是疯狂的,可能有些垃圾。
我不知道为什么会这样。
如果有人对如何解决有任何想法,我将不胜感激。
答案 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
。