假设我有一些对象的 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/