在 C++ 中创建指针向量或指针值映射时遇到问题

Posted

技术标签:

【中文标题】在 C++ 中创建指针向量或指针值映射时遇到问题【英文标题】:Having trouble in C++ Creating vector of pointers or map of Pointer values 【发布时间】:2018-11-08 07:12:39 【问题描述】:

为了提供一些上下文,我正在尝试创建一个看起来像以下任何一个的地图或矢量: 我都试过了,似乎都不能正常工作。

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

【问题讨论】:

您应该使用new Player() 而不是nullptr,当您尝试访问分配为nullptr 的指针时会导致各种问题... vector&lt;Player*,Player*&gt; 不是有效的向量实例化。 【参考方案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_ptrstd::make_unique,而不是原始指针。

【讨论】:

如果我把它做成一对,一个值(玩家)不会映射到另一个吗? 一对只是两个值。它们是捆绑在一起的,但对于任何容器来说都是如此。此外,std::pair::second 可以是nullptr,这样就没有这样的“映射”。 最终制作了一个 std::vector<:pair player>> regionOwnersVec;就像你所说。按我需要的方式工作。谢谢!!!【参考方案2】:
std::vector<std::array<Player*, 2>>

将按您的意愿工作,即它最多只允许 2 个区域所有者,您可以使用双 operator[]

std::vector<std::array<Player*, 2>> regionOwners (11, nullptr, nullptr);
if(regionOwners[5][1]) 
    //blahblah

为方便起见,您可以创建一个名称别名:

using RegionOwners = std::vector<std::array<Player*, 2>>;
RegionOwners regionOwners (11, nullptr, nullptr);

【讨论】:

我试过了,但每当我尝试这样做时:regionOwners[region][0] 我得到: Type 'std::__1::__vector_base<:__1::array>,std::__1::allocator<:__1::array> > >::value_type'(又名 'std::__1::array')没有提供下标运算符

以上是关于在 C++ 中创建指针向量或指针值映射时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

在向量 C++ 中处理指针

如何设法在 C++ 中创建矢量类?

用于删除 Map 中的指针值和指针向量的 C++ 通用代码

在属于不同类的函数中创建指向类的指针

在 C++ 中创建对象并将指针传递给 python

指针对象在 Visual C++ 6.0 中创建 windows 错误