使用派生类的向量映射

时间:2016-05-02 00:45:09

标签: c++

class Base
{
protected:
   int x;
public:
   Base();
   ~Base();
   virtual void displayx(){
     cout << x << endl;
   }
};

class Derived:public Base
{
public:
   Derived();
   ~Derived();
   void displayx(){
     cout << x << endl;
   }
};

int main()
{
Base * tanuki;

tanuki = new Derived;

//Unsure about these final lines of code.
std::map< string, vector<Base*>> myMap;

myMap.insert(make_pair("raccoon",vector<....*>()));
}

我希望能够在myMap中存储Derived的新实例。 然后使用map中指定的标识符字符串调用displayx()函数。 我尝试了很多东西,但我相信我已经撞墙了。

我应该如何插入派生类&#39; Derived&#39;基地&#39;基地&#39;进入我的矢量地图?

2 个答案:

答案 0 :(得分:1)

鉴于

std::map< string, vector<Base*>> myMap;

你所拥有的是从字符串到Base *指针向量的映射。因此,您需要查找映射到“racoon”的给定向量,然后将push_back查找到它。

auto& racoon = myMap["racoon"];  // reference to the vector
racoon.push_back(tanuki);

你也可以写成

myMap["racoon"].push_back(tanuki);

另一种可能性

auto it = myMap.find("racoon");
if (it == myMap.end())
    myMap.insert(std::make_pair<std::string, std::vector<Base*>>("racoon", {tanuki}));
else
    it->second.push_back(tanuki);

(见http://ideone.com/Odgl2y

---编辑---

你想调用displayx,这里是你如何在racoon向量的所有元素上调用displayx:

auto it = myMap.find("racoon");
if (it == myMap.end()) {
    // it->first is the key, it->second is the value, i.e the vector
    for (Base* b : it->second) {
        b->displayx();
    }
}

---编辑2 ---

在C ++ 98中,要将插入一个新元素添加到地图中,您可以这样做:

myMap.insert(std::make_pair<std::string, std::vector<Base*>>("racoon", std::vector<Base*>()));

或者如果您正在使用

typedef std::vector<Base*> Bases;  // or BaseVec or something
你会写

myMap.insert(std::make_pair<std::string, Bases>("racoon", Bases()));

最后一部分是创建一个空矢量作为第二个参数传递。

答案 1 :(得分:1)

对于这种特殊情况,这比你想象的要简单得多:

Base * tanuki= new Derived;

std::map< string, vector<Base*>> myMap;

myMap["racoon"].push_back(tanuki);

operator[]为您提供了给定键的值的引用,值初始化一个必要的新值。因此,您可以免费获得矢量结构。然后你只需push_back()将新元素放入向量中。