![](/img/trans.png)
[英]How does a C++ std::container (vector) store its internals (element address, access by index)?
[英]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.