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;进入我的矢量地图?
答案 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);
---编辑---
你想调用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
()将新元素放入向量中。