Получить индекс элемента std :: vector по его адресу - PullRequest
9 голосов
/ 17 ноября 2011

Допустим, у меня есть std :: vector, и я каким-то образом получаю адрес n-го элемента.Есть ли простой способ (быстрее, чем итерация по вектору) получить индекс, по которому появляется элемент, учитывая базовый адрес моего std :: vector?Предположим, я уверен, что элемент находится в векторе.

Ответы [ 3 ]

17 голосов
/ 17 ноября 2011

Поскольку вы знаете, что элемент находится внутри вектора, а вектор гарантирует, что его хранилище является смежным, вы можете сделать:

index = element_pointer - vector.data();

или

index = element_pointer - &vector[0];

Обратите внимание, что технически смежныегарантия была введена в C ++ 03, но я не слышал о реализации C ++ 98, которая не следует за ней.

5 голосов
/ 17 ноября 2011

расстояние (xxx.begin (), Итератор);

Вышеуказанное будет работать только для вектора :: итератор. Если у вас есть только необработанный указатель на элемент, вы должны использовать его следующим образом:

расстояние (& v [0], theElementPtr);

1 голос
/ 17 ноября 2011

Да - поскольку вектор гарантирует, что все элементы находятся в непрерывном блоке памяти, вы можете использовать арифметику указателей, чтобы найти его следующим образом:

#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
   std::vector<int> vec;

   for(int i=0; i<10; ++i)
   {
      vec.push_back(i);
   }

   int *ptr=&vec[5];
   int *front=&vec[0];

   std::cout << "Your index=" << ptr-front << std::endl;
   return 0;
}
...