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

C++: struct pointer in map structure

本文关键字:结构 指针 C++ 映射      更新时间:2023-10-16

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

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所指向的结构,但我尝试了一切,但都没有成功。

我打印了它的记忆地址->秒和&piecesTog[tam]和它们是一样的,但当我做(*aux(.height或it->second->height时,它们给出的数字完全疯狂,可能是一些垃圾。

我不知道为什么会发生这种事。

如果有人知道如何修复它,我将不胜感激。

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

几乎可以肯定没有遵循Iterator无效规则。

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

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

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

晃来晃去。当你将来使用这些指针时,Ka Blammo!如果你运气好的话,还可以有未定义的行为和容易识别的撞车事故。

提供的信息不足,无法提供明确的解决方案,但以下是一些通用的替代方案(按吸引力排序(:

如果您提前知道将进入piecesTogpiece的数量,则可以使用reserve存储来消除调整vector大小的需要。

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

如果可以这样做,请重写读取器,将所有pieces加载到piecesTog中,然后构建映射。

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