template <class T>
std::size_t GetIndexFromRef(std::vector<T> const &vec, T const &item)
{
T const *data = vec.data();
if(std::less<T const *>{}(&item, data) || std::greater_equal<T const *>{}(&item, data + vec.size()))
throw std::out_of_range{"The given object is not part of the vector."};
return static_cast<std::size_t>(&item - vec.data());
};
字符串 我使用std::less和std::greater_equal,因为([comparisons.general§2]): 对于模板less、greater、less_equal和greater_equal,任何指针类型的专门化都会产生与实现定义的指针上的严格全序一致的结果([defns.order.ptr])。 [* 注1*:如果a < b对于类型为P的指针a和b定义良好,则(a < b) == less<P>()(a, b),(a > b) == greater<P>()(a, b),依此类推。 否则,与不属于向量的对象执行比较将是UB。
1条答案
按热度按时间qni6mghb1#
这就是诀窍:
字符串
我使用
std::less
和std::greater_equal
,因为([comparisons.general§2]):对于模板
less
、greater
、less_equal
和greater_equal
,任何指针类型的专门化都会产生与实现定义的指针上的严格全序一致的结果([defns.order.ptr])。[* 注1*:如果
a < b
对于类型为P
的指针a
和b
定义良好,则(a < b) == less<P>()(a, b)
,(a > b) == greater<P>()(a, b)
,依此类推。否则,与不属于向量的对象执行比较将是UB。