在C ++中遇到麻烦,无法创建指针向量或指针值映射

时间:2018-11-08 07:12:40

标签: c++ dictionary pointers vector boost

为了提供一些背景信息,我正在尝试创建看起来像以下任意一种的地图或矢量: 我都尝试过,但似乎无法正常工作。

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的一个节点转到另一个节点。 谢谢。

2 个答案:

答案 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
}