[英]How to use STL map?
我有一个私人领域
std::map<std::string, std::multiset<GraphObject*>>* the_Map;
如何为它分配内存并插入GraphObject? 我必须使用新的运营商吗?
the_Map = new map<string,multiset<GraphObject*>>;
我如何插入新的GraphObject? 它是数据结构的一部分,我真的需要一个指向地图的指针。
你为什么要存储::std:multiset
GraphObject *
的::std:multiset
有点模糊,但让我们滚动它。
这是一个很简单的文档回答,但StackOverflow毫无疑问,所以......
the_Map = new map<string,multiset<GraphObject*>>;
这确实是你为地图分配内存的方式。 对于周围存在的东西只是指点一下通常不是一个好主意,但你坚持,这就是你如何做到的。 这意味着您必须记住在某些时候delete
它。 而且你必须确保持有指针的类的复制结构做正确的事(并说正确的事情会相当复杂)。
你现在有一个有趣的问题。 您正在每个映射条目中存储multiset
。 幸运的是,当访问以前未知的密钥时,将自动创建并初始化此多集。 OTOH,你使用裸指针意味着你有一个异常安全问题。 如果在路上的任何地方抛出异常,则可能泄漏内存。 所以你必须捕获任何异常并清理你的对象:
GraphObject *tmp = new GraphObject;
try {
(*the_Map)[key].insert(tmp);
} catch (...) {
delete tmp;
throw;
}
你的问题是如此基本的事实让我质疑你需要使用指针的断言。 我真的不知道你会不会宁愿一个multimap
,而不是map
从string
- > multiset
。 但是,您坚持数据结构的一般形式。 所以上面就是你如何使用它。
我还要说这个数据结构大量使用裸指针是一个非常糟糕的主意。 你必须编写一个非常复杂的函数来正确地解构或复制整个混乱。
编辑 : 叹息编码在凌晨4点的数据结构我永远不会创建自己导致我写一些非常愚蠢的代码。 目前的版本要好得多。 虽然这个答案真的比我的好多了。
如何为它分配内存并插入GraphObject?
它根本不想成为一个指针; 只需使地图本身成为类的成员,内存分配将自动发生。
正确地插入一个对象是相当繁琐的,因为你也在那里存储指针。 如果它不需要是指针,那么存储对象将使您的生活更轻松。 如果它确实必须是一个指针(例如因为GraphObject
是一个多态基类),我建议存储智能指针: std::unique_ptr
,或std::tr1::shared_ptr
或boost::shared_ptr
如果你被卡住了以往。
如果你确实需要使用原始指针来解决一些疯狂的原因,那么最接近异常安全插入的可能就是:
GraphObject * object = new Whatever(...);
try {
the_Map[key].insert(object);
} catch(...) {
delete object;
throw;
}
或者如果您不关心插入失败时内存泄漏的可能性:
the_Map[key].insert(new Whatever(...));
另外,不要忘记删除每个对象时删除它们; 这不会自动发生。
我真的需要一个指向地图的指针。
不,你没有。 但如果你真的相信你这样做,并且想要忽略每个人的建议,那么你需要一个实际的地图指向。 我建议您将此映射作为该类的成员,以便自动管理其生命周期。
如果你真的想让维护代码的人生活困难,那么我想你可以用new
分配一个。 在这种情况下,请记住在完成后删除它; 可能在类析构函数中。 如果你这样做,请记住Rule of Three并实现或删除复制构造函数和复制赋值运算符,因为默认实现将执行错误的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.