c++ - 如何使用 std::distance 查找指向 std::array 元素的指针的数组索引?

标签 c++ c++11 iterator

假设我有一些对象的 std::array 并创建指向其中一个对象的指针。

std::array<Object, 100> my_array;

Object* ptr_object = &my_array[50]; 

所以假设我不知道 ptr_object 引用的索引,我将如何在 C++11 中返回并找到这个索引?

我遇到了一些建议 std::distance 可能有帮助的读数,但是,我的尝试

std::distance(my_array, ptr_object);

抛出一个错误,指出“找不到匹配的重载函数”。

最佳答案

获取索引最简单的方法是使用指针算法。只需从指向第一个元素的指针中减去指向所需元素的指针,例如:

size_t index = (ptr_object - my_array.data()/*&my_array[0]*/);

std::distance() 将迭代器作为输入,原始指针可以用作迭代器。因此,您可以使用指向第一个元素的指针作为起始迭代器,并使用指向所需元素的指针作为结束迭代器,例如:

size_t index = std::distance(my_array.data()/*&my_array[0]*/, ptr_object);

请注意这与您的代码有何不同,您在其中尝试将 std::array 本身传递给 std::distance()。那是行不通的。

以上两者都具有恒定的复杂性,因为它们是简单的算术运算(std::distance() 针对随机访问迭代器进行了优化,例如原始指针和 std::array 迭代器)。

或者,您可以改用实际的迭代器,但这需要遍历数组以获得指向所需元素的迭代器,而无需事先知道其索引,例如:

auto iter = std::find_if(std::begin(my_array), std::end(my_array), [=](Object &o) { return (&o == ptr_object); });
size_t index = std::distance(my_array.begin(), iter);

关于c++ - 如何使用 std::distance 查找指向 std::array 元素的指针的数组索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51488930/

相关文章:

c++ - 如何使用 "unique"从 vector 中删除重复项?

c++ - 强制C++类具有对齐的属性

c++ - 为什么 decltype 从内置类型的返回类型中删除 const?

c++ - g++ 错误 : specialization after instantiation (template class as friend)

c++ - 为什么必须在父类(super class)中实现虚函数?

c++ - 针对结束迭代器测试 lower_bound 的返回值

iterator - 如何在 Rust 中为特定集合类型(list/set/map)创建一个空迭代器?

c++ - (为什么)std::chrono文字是左值?

c++ - 如何在 OpenCV 应用程序中更改轨迹栏的位置?

c++ - 如何用另一个/c++代码替换一行