如何从 std::vector 的其中一项的引用中获取其元素的索引?

Vic*_*tor 2 c++ stdvector

您将如何优雅地(以现代 C++ 方式)编写一个返回向量元素索引的函数,并将该向量作为参数,并引用其元素之一?

异常处理将不胜感激。

#include <vector>

template <class T>
std::size_t GetIndexFromRef(std::vector<T> &vec, T &item)
{
...
};
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 6

这可以解决问题:

\n
template <class T>\nstd::size_t GetIndexFromRef(std::vector<T> const &vec, T const &item)\n{\n    T const *data = vec.data();\n\n    if(std::less<T const *>{}(&item, data) || std::greater_equal<T const *>{}(&item, data + vec.size()))\n        throw std::out_of_range{"The given object is not part of the vector."};\n    \n    return static_cast<std::size_t>(&item - vec.data());\n};\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用std::lessand std::greater_equal,因为([comparisons.general\xc2\xa72]):

\n
\n

对于模板lessgreaterless_\xc2\xadequalgreater_\xc2\xadequal,任何指针类型的特化都会产生与实现定义的严格指针全序 ([defns.order.ptr]) 一致的结果。
\n[注 1:如果a < b是明确定义的指针ab类型为P,则(a < b) == less<P>()(a, b)(a > b) == greater<P>()(a, b),依此类推。\n\xe2\x80\x94尾注]

\n
\n

否则,与不属于向量一部分的对象进行比较将是 UB。

\n