c++ - 如何从对其中一个项目的引用中获取 std::vector 元素的索引?
问题描述
您将如何优雅地(并以现代 C++ 方式)编写一个函数,该函数返回向量元素的索引,将此向量作为参数,并引用其中一个元素?
异常处理将不胜感激。
#include <vector>
template <class T>
std::size_t GetIndexFromRef(std::vector<T> &vec, T &item)
{
...
};
解决方案
这可以解决问题:
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
and std::greater_equal
,因为([comparisons.general§2]):
对于模板
less
、greater
、less_equal
和greater_equal
,任何指针类型的特化都会产生与实现定义的严格指针总顺序一致的结果 ([defns.order.ptr])。
[注 1:If对于指针和类型a < b
是明确定义的,那么,,等等。——尾注]a
b
P
(a < b) == less<P>()(a, b)
(a > b) == greater<P>()(a, b)
否则,与不属于向量的对象进行比较将是 UB。
推荐阅读
- python - Python模块'modules'没有属性'millis'
- linux - 如何在 UNIX 中替换空字符?
- node.js - 如何在 Express 中将静态文件提供给不同的路由?
- powerbi - 累积和的 DAX 代码(在一列中)
- c# - 无法从“字符串”转换为“Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole”
- python-3.x - 错误:写入非空集合
- scala - Scala - 使用理解的默认值的两个数组的条件乘积/连接
- java - 如何禁用谷歌云平台集成?
- php - 尝试获取 ORCID 记录时出现错误 301
- javascript - 将图像 URI 转换为文件或 Blob