为了提供一些背景信息,我正在尝试创建看起来像以下任意一种的地图或矢量: 我都尝试过,但似乎无法正常工作。
vector<Player*,Player*> regionOwners;
map<int, vector<Player*>> regionOwners;
基本上,我在游戏中具有与整数值(0-10)相对应的区域 大多数地区只能拥有1个拥有者(玩家),但是某些区域也可以拥有2个拥有者。 这就是我想要一个向量的原因,以便可以转到regionOwners [regionNumber] [0]或regionOwners [regionNumber] [1]并访问playerObject或nullptr。如果可能的话,我想将向量大小设置为最大2。
我本质上想存储这样的示例:
1 --> [PlayerPtr*]
2 --> [Player1Ptr*, Player2Ptr*]
3 --> [nullptr, nullptr]
4 --> [nullptr]
5 --> [Player1Ptr*, nullptr]
6 --> [nullptr, Player1Ptr*]
我似乎无法使用nullptrs初始化我的矢量或地图,以指示该区域没有所有者。
for(int i=0; i< gameMap->getVertexCount(); i++) {
if(gameMap->getVertex(i)->getData() == "outer") {
regionOwners[i].push_back({nullptr , nullptr}); // vector style
}
else if (gameMap->getVertex(i)->getData() == "inner") {
regionOwners.insert({i, {nullptr}});
}
}
我尝试了地图和矢量的所有变体。我很沮丧。
regionOwners[i]= {nullptr , nullptr}; // vector
regionOwners.insert({nullptr, nullptr}); // vector
map<int,vector<Player*>> something;
something.insert(i, {nullptr, nullptr});
regionOwners[i].push_back({nullptr , nullptr});
regionOwners.push_back(i ,{nullptr , nullptr});
我想知道有人对如何解决我的问题有什么建议,因为我知道我很可能会犯错。我想到了使用链表的向量,以便一旦我解决了该区域,就可以从Player的一个节点转到另一个节点。 谢谢。
答案 0 :(得分:1)
首先,这个
vector<Player*,Player*> regionOwners;
无法按预期工作。 std::vector
存储标量条目(第二个模板参数是您可能现在不想指定的分配器),因此该声明将被编译器拒绝。
如果可能的话,我想将向量大小设置为最大2
这使其成为std::pair
,而不是std::vector
。您可以尝试以下方法之一:
std::vector<std::pair<Player*, Player*>> regionOwnersVec;
std::map<int, std::pair<Player*, Player*>> regionOwnersMap;
现在您可以使用它们,例如如下所示。
// allocates memory if necessary:
regionOwnersVec.push_back({nullptr, nullptr});
// ... or set some predefined size, which allocates and default-initializes:
regionOwnersVec.resize(42);
// ... which enables indexing the vector:
regionOwnersVec[10] = {nullptr, nullptr};
或者对于std::map
实例,
regionOwnerMap[10] = {nullptr, nullptr};
请注意,如果您想让容器拥有实例,请与std::unique_ptr
一起使用std::make_unique
而不是原始指针。
答案 1 :(得分:0)
AudioListener
将按您希望的方式工作,即最多只允许2个区域所有者,并且您可以使用双std::vector<std::array<Player*, 2>>
:
operator[]
为方便起见,您可以创建一个别名:
std::vector<std::array<Player*, 2>> regionOwners (11, {nullptr, nullptr});
if(regionOwners[5][1]) {
//blahblah
}