繁体   English   中英

如何使用STL地图?

[英]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 ,而不是mapstring - > multiset 但是,您坚持数据结构的一般形式。 所以上面就是你如何使用它。

我还要说这个数据结构大量使用裸指针是一个非常糟糕的主意。 你必须编写一个非常复杂的函数来正确地解构或复制整个混乱。

编辑叹息编码在凌晨4点的数据结构我永远不会创建自己导致我写一些非常愚蠢的代码。 目前的版本要好得多。 虽然这个答案真的比我的好多了。

如何为它分配内存并插入GraphObject?

它根本不想成为一个指针; 只需使地图本身成为类的成员,内存分配将自动发生。

正确地插入一个对象是相当繁琐的,因为你也在那里存储指针。 如果它不需要是指针,那么存储对象将使您的生活更轻松。 如果它确实必须是一个指针(例如因为GraphObject是一个多态基类),我建议存储智能指针: std::unique_ptr ,或std::tr1::shared_ptrboost::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM