在地图C ++中获取指向结构的指针

时间:2009-09-04 21:29:26

标签: c++ stl map

好的,我有像这样的结构

typedef struct
{
float x;
float y;
char name[];
} pTip;

另一个结构

typdef struct
{
    float xx;
    float yy;
    pTip *tip;
}finalTip;

我创建并填充map<string, pTip>地图

工作正常。 我现在正在尝试生成finalTips的矢量

我做:

map<string, pTip>::const_iterator iter = maps.find(p_name);

所以它很好用我的迭代器现在有我需要的东西,我可以用

提取信息
(iter->second).x

但是我想现在使用那个迭代器将它保存在我的finalTip struc obj final中 所以我试过了:

finalTip final;
final.tip = iter->second;

对于这种情况,我收到错误:

错误:无法在赋值

中将'const pTip'转换为'pTip *'

所以我修复了:

*final.tip = iter->second;

这是正确的解决方法还是我做错了。 这似乎有效,但我想确保我做得对

4 个答案:

答案 0 :(得分:4)

你想要

final.tip = &iter->second;

由于itermap<string, pTip>迭代器,iter->second是对pTip的引用。带上&amp;的地址获得一个指针。

不幸的是,由于您有const_iterator&iter->second将是(const pTip *)

所以,要么得到一个非const迭代器,要么使.tip成员成为const pTip *,或者如果你绝望,就抛弃const:

final.tip = const_cast<pTip*>(&iter->second);

最后说明:您可能更喜欢pTip const*const pTip * - 它们的意思相同。

答案 1 :(得分:0)

您是否已将final.tip初始化为指向“空”的提示......?否则你将复制到未初始化的内存中。也许你的意思是final.tip = new pTip(iter->second),即复制构造函数进入新分配的存储?另外要注意那个char name[]构造 - 如果没有长度,自动生成的复制构造函数可能会遇到麻烦,所以你可能需要明确地编写你需要的拷贝代码!

答案 2 :(得分:0)

我很惊讶这个作品。除非你有一个初始化你在这里显示的final.tip的代码,否则这会在内存中的随机位置写入iter-&gt; second的值,这会导致不可预测的结果。

答案 3 :(得分:0)

此代码:

*final.tip = iter->second

很可能最终导致您的程序开始表现不正常。你在踩着记忆。 final.tip是一个未初始化的指针,它可以指向任何地方。无论它指向用iter-&gt; second的内容覆盖的任何地方,你都会造成这种情况。

我不完全确定你想在这里完成什么。您的问题的答案在很大程度上取决于此。

pTip中的char name[]构造也很有趣且有问题。看起来你正试图在结构的末尾使用弹性缓冲区,这是一种常见的C技术。当与STL容器混合时,这不太可能正常工作。

我怀疑你打算将地图映射到指针而不是结构副本。我怀疑你的意思更像是:

typedef struct
{
float x;
float y;
char name[];
} *pTip;