获取给定地址的std::vector元素的索引
Get the index of a std::vector element given its address
假设我有一个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;
}
在这里测试运行。这是开放的进一步研究(或向大师学习)哪一个是最安全/安全和/或最有效的方法。
相关文章:
- 对 Vector 元素 (C++) 的push_back操作
- 有没有函数可以直接获取 std::vector 元素的大小?
- 使用 stl 排列 std::vector 元素的最短解决方案
- 在不调用构造函数的情况下创建 Vector 元素
- 分配std :: vector元素的两种方法
- 如何对std::vector元素中的对象使用shared_mutex
- 在 GDB 漂亮的打印机中显示特定的 std::vector 元素
- 将分配到std :: vector元素线程安全
- 是否可以使用 std::vector 元素的地址作为指针
- 访问std::vector元素的速度会随着向量大小而减慢
- 指向 std::vector 元素时编译器错误<bool>?
- 通过 std::vector.data() 指向 std::vector 元素的指针指向损坏的数据
- 指向所有 std::vector 元素的指针
- 调用在函数调用期间重新分配的“std::vector”元素的函数是否会导致麻烦
- 使用下标运算符进行Integer Vector元素比较失败,但使用at函数成功
- 填充一个无序的vector元素指针队列
- 将vector元素赋值给调用emplace_back的函数的result
- 调用带有引用vector元素参数的c++函数
- 将vector元素转换为字符串进行比较
- vector元素被覆盖