获取给定其地址的std :: vector元素的索引

时间:2011-11-16 21:36:17

标签: c++ stl stdvector

假设我有一个std :: vector,我通过某种方式获得了第n个元素的地址。 给定我的std :: vector的基地址,是否有一种简单的方法(比迭代迭代更快)来获得元素出现的索引?我们假设我确定元素在向量中。

3 个答案:

答案 0 :(得分:17)

由于您知道元素在向量中,并且向量保证其存储是连续的,您可以这样做:

index = element_pointer - vector.data();

index = element_pointer - &vector[0];

请注意,从技术上讲,连续保证是在C ++ 03中引入的,但我没有听说过C ++ 98实现不会发生这种情况。

答案 1 :(得分:5)

距离(xxx.begin(),theIterator);

以上内容仅适用于vector :: iterator。如果您只有一个指向元素的原始指针,则必须以这种方式使用它:

距离(& v [0],theElementPtr);

答案 2 :(得分:1)

是 - 因为向量保证所有元素都在一个连续的内存块中,你可以使用指针算法来查找它

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