Векторы, итераторы и std :: find - PullRequest
3 голосов
/ 24 февраля 2009

Есть ли способ использовать разные типы итераторов в разных векторах? Или есть функция, которая возвращает позицию элемента в векторе как целое число?

std::vector<DWORD>::iterator it;        // Iterator

// monsterQueue is a <DWORD> vector

it = std::find(bot.monsterQueue.begin(), bot.monsterQueue.end(), object);   
// Check do we have the object in the queue

if(it != bot.monsterQueue.end())    // If we do have it
{
    bot.monsterDists.at(it) = mobDist; // monsterDists is <int> vector
    bot.monsterCoordX.at(it) = PosX; // monsterCoordX is <int> vector
    bot.monsterCoordY.at(it) = PosY; // monsterCoordY is <int> vector too
}

Это пример кода, у кого-нибудь есть указатели?

Ответы [ 5 ]

12 голосов
/ 24 февраля 2009
index = std::distance( monsterQueue.begin(), it );
6 голосов
/ 24 февраля 2009

Попробуйте

std::vector<DWORD>::iterator it;        // Iterator

// monsterQueue is a <DWORD> vector

it = std::find(bot.monsterQueue.begin(), bot.monsterQueue.end(), object);   
// Check do we have the object in the queue

if(it != bot.monsterQueue.end())    // If we do have it
{

size_t idx = it - bot.monsterQueue.begin ()

    bot.monsterDists.at(idx) = mobDist; // monsterDists is <int> vector
    bot.monsterCoordX.at(idx) = PosX; // monsterCoordX is <int> vector
    bot.monsterCoordY.at(idx) = PosY; // monsterCoordY is <int> vector too
}

Также, вероятно, будет лучше создать структуру с 4 членами 'monster', monsterDist и координатаX и координата Y и сохранить объекты структуры в векторе.

6 голосов
/ 24 февраля 2009

Просто посчитайте

it - bot.monsterQueue.begin()

чтобы получить индекс.

1 голос
/ 24 февраля 2009

Задумывались ли вы об изменении базового типа monsterQueue на объект, который содержит или имеет ссылки / указатели на monsterDists и др.

1 голос
/ 24 февраля 2009

Вы можете использовать произвольный доступ в std :: vectors:

DWORD find_this = 0x0;
int pos = 0;
for (; i<monsterQueue.size(); ++i)
{
    if (monsterQueue[i]==find_this)
        break;
}

После цикла pos будет в том месте, где цикл прервался, то есть где find_this. За исключением, конечно, если find_this нет даже в векторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...