代码之家  ›  专栏  ›  技术社区  ›  Izzo

如何使用STD::查找指向数组元素的指针的数组索引的距离?

  •  0
  • Izzo  · 技术社区  · 7 年前

    假设我有一个STD::某个对象的数组,并创建指向其中一个对象的指针。

    std::array<Object, 100> my_array;
    
    Object* ptr_object = &my_array[50]; 
    

    假设我不知道PrTrObjor引用的索引,我将如何在C++11中来回搜索这个索引?

    我已经看到一些建议STD::距离可能有帮助,但是,我的尝试

    std::distance(my_array, ptr_object);
    

    引发一个错误,说明“找不到匹配的重载函数”。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Remy Lebeau    7 年前

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

    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::距离() . 那不管用。

    上述两种方法都具有恒定的复杂性,因为它们都是简单的算术运算。( STD::距离() 为随机访问迭代器优化,如原始指针和 STD::阵列 迭代器)。

    或者,您可以使用实际的迭代器,但这需要遍历数组以在不事先知道其索引的情况下获得所需元素的迭代器,例如:

    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);
    
        2
  •  2
  •   AnT stands with Russia    7 年前

    我建议不要无缘无故地使用 std::distance 除非这是你的要求。

    STD:距离 是一个接口统一函数,其目的是允许计算各种迭代器之间的距离:随机访问、双向、正向等。此函数旨在隐藏直接计算非随机访问迭代器距离的效率,在您真正知道自己在做什么和真的想接受这种低效。它旨在突出您的代码(如强制转换),表明在一般情况下,代码可能效率低下,但您至少现在愿意接受这一点,如临时的“草图”代码。(同样适用于 std::advance )

    如果您不打算“隐藏”效率低下的情况,也就是说,您打算只使用随机访问迭代器,那么不要使用 STD:距离 . 减去迭代器

    std::ptrdiff_t i = ptr_object - my_array.data();