C++ 获取指向映射C+中结构的指针+;

C++ 获取指向映射C+中结构的指针+;,c++,stl,map,C++,Stl,Map,我有这样的结构 typedef struct { float x; float y; char name[]; } pTip; 还有另一种结构 typdef struct { float xx; float yy; pTip *tip; }finalTip; 我创建并填充地图地图 那很好。 我现在尝试生成finalTips的向量 我有: map<string, pTip>::const_iterator iter = maps.find(p_name);

我有这样的结构

typedef struct
{
float x;
float y;
char name[];
} pTip;
还有另一种结构

typdef struct
{
    float xx;
    float yy;
    pTip *tip;
}finalTip;
我创建并填充
地图
地图

那很好。 我现在尝试生成finalTips的向量

我有:

map<string, pTip>::const_iterator iter = maps.find(p_name);
但我现在想用迭代器把它保存在finalTip struc obj final中 所以我试着:

finalTip final;
final.tip = iter->second;
对于这种情况,我得到一个错误:

错误:无法将分配中的“常量pTip”转换为“pTip*”

因此,我修正了:

*final.tip = iter->second;
这是正确的修复还是我做错了。
这似乎可行,但我想确保我做得正确

如果您初始化了
final.tip
指向“空”tip。。。?否则,您将复制到未初始化的内存中。也许您的意思是
final.tip=new-pTip(iter->second)
,即将构造函数复制到新分配的存储中?还要注意
char-name[]
construct——如果没有长度,自动生成的复制构造函数在正确操作时可能会遇到麻烦,因此您可能需要显式编写所需的复制构造函数

是否已初始化
final.tip
以指向“空”tip。。。?否则,您将复制到未初始化的内存中。也许您的意思是
final.tip=new-pTip(iter->second)
,即将构造函数复制到新分配的存储中?还要注意
char-name[]
construct——如果没有长度,自动生成的复制构造函数在正确操作时可能会遇到麻烦,因此您可能需要显式编写所需的复制构造函数

我很惊讶这能奏效。除非您有一个初始化这里显示的final.tip的代码,否则这会将iter->second的值写入内存中的一个随机位置,这可能会导致不可预测的结果。

我很惊讶这能起作用。除非您有一个初始化此处显示的final.tip的代码,否则这将在内存中的随机位置写入iter->second的值,这可能导致不可预测的结果。

此代码:

*final.tip = iter->second
很可能最终导致您的程序开始异常运行。你在浪费记忆。final.tip是一个未初始化的指针,它可以指向任何地方。你正在使它指向的任何地方都被iter->second的内容覆盖

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

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

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

typedef struct
{
float x;
float y;
char name[];
} *pTip;
此代码:

*final.tip = iter->second
很可能最终导致您的程序开始异常运行。你在浪费记忆。final.tip是一个未初始化的指针,它可以指向任何地方。你正在使它指向的任何地方都被iter->second的内容覆盖

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

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

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

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

final.tip = &iter->second;
由于
iter
是一个
map
迭代器,
iter->second
是对pTip的引用。使用&获取其地址以获取指针

不幸的是,由于您有一个
常量迭代器
&iter->second
将是一个
(常量pTip*)

因此,要么使用非常量迭代器,要么将.tip成员设置为
常量pTip*
,或者如果您非常绝望,请丢弃常量:

final.tip = const_cast<pTip*>(&iter->second);
final.tip=const\u cast(&iter->second);
最后一点注意:您可能更喜欢
pTip-const*
而不是
const-pTip*
——它们的意思是一样的。

您想要什么

final.tip = &iter->second;
由于
iter
是一个
map
迭代器,
iter->second
是对pTip的引用。使用&获取其地址以获取指针

不幸的是,由于您有一个
常量迭代器
&iter->second
将是一个
(常量pTip*)

因此,要么使用非常量迭代器,要么将.tip成员设置为
常量pTip*
,或者如果您非常绝望,请丢弃常量:

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

最后一点注意:您可能更喜欢
pTip-const*
而不是
const-pTip*
——它们的意思是相同的。

您需要更清楚地解释您在这里试图实现的目标。例如,finalTip的名字很奇怪。还有,如果你只想阅读其中一条,为什么还要把所有这些提示都列在一个列表中呢?复制构造(“*final.tip=iter->second;”)通常也是一件奇怪的事情。您需要更清楚地解释您在这里试图实现的目标。例如,finalTip的名字很奇怪。还有,如果你只想阅读其中一条,为什么还要把所有这些提示都列在一个列表中呢?复制构造(“*final.tip=iter->second;”)通常也是一件奇怪的事情。字符名[]构造将是一件非标准的事情,因此您是对的,他需要注意这一点(MSC不会为此类结构自动生成复制构造函数或赋值操作符)。特别是,如果他将其保存在映射中,然后我只能看到失败的结果。调用insert,然后当映射复制它时,它会不会切断
name
通常应该覆盖的部分?不确定MSVC将如何处理这个问题。
char name[]
构造将是一个非标准的东西,所以