Возникли проблемы в C ++ Создание вектора указателей или карты значений указателей - PullRequest
0 голосов
/ 08 ноября 2018

Чтобы дать некоторый контекст, я пытаюсь создать карту или вектор, который выглядит так: Я попробовал и то, и другое, и, похоже, он не работает.

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}); 

Мне было интересно, какие предложения есть у кого-нибудь о том, как решить мою проблему, так как я знаю, что, скорее всего, ошибаюсь. Я подумал об использовании вектора связанного списка, чтобы я мог просто перейти от одного узла проигрывателя к другому после того, как я определил регион. Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018
std::vector<std::array<Player*, 2>>

будет работать так, как вы хотели, то есть разрешено использовать не более 2 владельцев регионов, и вы можете использовать double 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});
0 голосов
/ 08 ноября 2018

Прежде всего, это

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 вместо необработанных указателей.

...