1

与我发布的另一个问题相关,我试图以某种方式找到解决方案 - C++ dynamic way to determine the container to use

注意到类似的链接:

如何在 C++ 中使用字符串作为变量名?

如何通过存储在另一个变量中的名称来寻址变量(C++)

已编辑 - 从 int 到 float..

编辑 2 - 以下似乎在此链接上有一些解决方案 - 但需要以某种方式翻译手头的这个问题..

当类名存储在另一个变量中时如何创建类的实例

我有以下结构:

Class Items
{
  float itemType;
  float itemPrice;
  Items(){};
  ~Items(){};
};

typedef std::unique_ptr<Items> pptr;
typedef std::pair<float, pptr> itemsRec;
std::multimap<float, pptr> mapItems;

在创建新的 mapItems 地图方面需要帮助......任何人都可以帮助创建这个新的 mapItems 地图的语法吗?让我们假设“A”是通过其他方式派生的。

谢谢

std::map<string, pointer to mapItems> myMap;  // What's the syntax for this?

myMap["A"]={create a new map - mapItems_A and assign pointer here};

谢谢。

编辑 3 - 仍在探索选项 - 看起来下面的链接有一些有趣的东西,在我的情况下可能有助于动态定义容器。进一步探索。

http://sourcemaking.com/design_patterns/factory_method/cpp/1#

4

2 回答 2

2

您请求的类型的语法是std::map<std::string, std::multimap<float, pptr>*>,但您不需要使用指针;你可以用std::map<std::string, std::multimap<float, pptr> >

std::map::operator[]自动默认构造一个条目并在请求的键不存在时插入它,因此如果映射类型为std::multimap<float, pptr>,它将在需要时自动构造与映射中特定键对应的多映射。例如:

    std::map<std::string, std::multimap<float, pptr> > myMap;
    std::multimap<float, pptr>& myMap_A = myMap["A"];

如果映射类型是,std::multimap<float, pptr>*那么它只是一个原始指针,因此它将被初始化为nullptr(0),您需要手动检测它,为该键分配一个新的多重映射,并存储其地址。您还需要确保delete在映射被销毁之前遍历映射和所有动态分配的多映射,并确保在未delete先对其多映射进行覆盖的情况下永远不会覆盖非空指针。所有这些都可以通过不使用原始指针作为映射类型来避免。事实上,您通常应该避免使用拥有数据所有权的原始指针;改用智能指针

最后一点:使用浮点类型作为容器键有点冒险,因为很容易遇到由于舍入错误而不太相等的值。

于 2013-05-17T02:49:12.717 回答
1
std::map<std::string, std::multimap<float, pptr>*> myMap;
std::multimap<float, pptr>* mapItems_A = new std::multimap<float, pptr>();
myMap["A"] = mapItems_A;

请记住,您的地图指向一个空的多地图。

于 2013-05-17T02:22:26.553 回答