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

Get the index of a std::vector element given its address

本文关键字:vector 元素 索引 std 地址 获取      更新时间:2023-10-16

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

既然知道元素在vector中,并且vector保证其存储是连续的,那么可以这样做:

index = element_pointer - vector.data();

index = element_pointer - &vector[0];

请注意,从技术上讲,连续保证是在c++ 03中引入的,但我还没有听说过一个c++ 98实现不遵循它。

distance(xxx.begin(), theIterator);

以上操作只适用于vector::迭代器。如果你只有一个指向元素的原始指针,你必须这样使用它:

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

是——因为vector保证所有元素都在一个连续的内存块中,所以你可以使用指针算术来找到它,像这样

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

在学习的过程中,我做了以下笔记:

#include <iostream>
#include <vector>
int main() {
    std::vector<std::string> words={"This","is","just","a","trial!"};
    size_t i; //using the contiguous property of a vector:
    for (auto const& elem : words) {
        i = &elem - &*words.begin();// or
        i = &elem - &words.front();// or 
        i = &elem - words.data();// or
        i = std::addressof(elem) - std::addressof(words[0]); 
        if(std::addressof(elem) == &words.front())
          std::cout << elem <<" (at"<<&elem<<") relative to ("<< &words[0] << ") takes position @#"<<i<< std::endl;
        else std::cout << elem <<" (at"<<&elem<< ") takes position @#"<<i<< std::endl;
    }
    return 0;
}

在这里测试运行。这是开放的进一步研究(或向大师学习)哪一个是最安全/安全和/或最有效的方法。