簡體   English   中英

獲取給定地址的 std::vector 元素的索引

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

假設我有一個 std::vector 並且我通過某種方式獲得了第 n 個元素的地址。 給定我的 std::vector 的基地址,是否有一種簡單的方法(比遍歷向量更快)來獲取元素出現的索引? 讓我們假設我確定元素在向量中。

由於您知道元素在向量中,並且向量保證其存儲是連續的,因此您可以執行以下操作:

index = element_pointer - vector.data();

要么

index = element_pointer - &vector[0];

請注意,從技術上講,連續保證是在C ++ 03中引入的,但我還沒有聽說過C ++ 98實現不會發生這種情況。

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

以上內容僅適用於vector :: iterator。 如果您只有一個指向元素的原始指針,則必須以這種方式使用它:

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

是 - 因為向量保證所有元素都在連續的內存塊中,所以您可以使用指針算法來查找它

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

試運行在這里 可以進一步研究(或向大師學習)哪一種是最安全/最安全和/或最有效的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM