C++ 如何在一个参数为对象的地图中插入数据?
我有一个类法线定义为:C++ 如何在一个参数为对象的地图中插入数据?,c++,stl,C++,Stl,我有一个类法线定义为: class Normal { bool value; float time; public: Normal(bool val,float time): value(val),time(time) {} } 此外,我还声明了一个映射变量: map<string,Normal> myMap; 如何将数据插入地图?使用此代码 Normal *temp = n
class Normal
{
bool value;
float time;
public:
Normal(bool val,float time): value(val),time(time) {}
}
此外,我还声明了一个映射变量:
map<string,Normal> myMap;
如何将数据插入地图?使用此代码
Normal *temp = new Normal(true,45.9);
mymap.insert(make_pair("one",temp));
避免浅复制,因为涉及指针
编辑:使用插入功能在地图中插入数据。索引不是最好的方法。特别是当您访问
有关详细信息,请参阅此链接
EDIT2:要删除,请使用以下代码
for(std::map<string, Normal*>::iterator itr = mymap.begin();it != mymap.end();)
{
if(it->second != NULL)
{
delete (it->second);
(it->second) = NULL;
it=mymap.erase(it);
}
else
{
++it;
}
}
for(std::map::iterator itr=mymap.begin();it!=mymap.end();)
{
如果(它->秒!=NULL)
{
删除(它->第二个);
(it->second)=NULL;
it=mymap.erase(它);
}
其他的
{
++它;
}
}
在C++03中:
myMap.insert(std::make_pair(
"one",
Normal(true, 45.04)
));
在C++11中:
m.emplace(std::piecewise_construct,
std::forward_as_tuple("one"),
std::forward_as_tuple(true, 45.04)
);
这两种方法都避免在
操作符[]中默认构造键值对,然后覆盖它。任何原因都禁止您使用映射
?普通*
是指针<代码>临时工
不是一个。你真的想让你的地图包含指针吗?我已经把它改成了Normal
。那么现在插入数据的正确方法是什么呢?也许读一下,看看insert
和操作符[]
之间的语义差异。找出你需要的是哪一个。OP的代码中没有任何东西表明他们需要动态分配(甚至在编辑之前)。指针并不自动意味着动态分配。@juanchopanza:我完全同意你的看法。但如果您使用指针,最好创建动态指针。我喜欢那样。:)@juanchopanza:你能用一个例子详细解释一下吗。这对我会有很大帮助。@Spanky你不是从映射中删除元素,只是在删除elem.second后将elem.second更新为null。删除后地图大小不会改变。@stophen:是的!!!这是一个很好的观点。编辑代码以添加擦除。这里有一个问题…mymap.clear(),它不会删除所有条目吗?
myMap.insert(std::make_pair(
"one",
Normal(true, 45.04)
));
m.emplace(std::piecewise_construct,
std::forward_as_tuple("one"),
std::forward_as_tuple(true, 45.04)
);