我可以将template<class T>
std::size_t get_index(std::vector<T>& vec, T* ptr){
const std::size_t i = ptr - &(*vec.begin());
return i;
}
元素指针转换为索引吗?
http://coliru.stacked-crooked.com/a/cedf3d849539e001
.List {
overflow: hidden;
max-height: 50px;
}
div {
display: inline-block;
}
如果向量中的元素保证是连续的,那么我认为我们可以做这样的指针算法......或者不是吗?
答案 0 :(得分:2)
矢量元素是连续存储的,是的。您也可以使用std::vector<T>::data()
代替&*std::vector<T>::begin()
。
您可以在以下网址了解详情:http://en.cppreference.com/w/cpp/container/vector
PS:已经存在一个问题 - Are std::vector elements guaranteed to be contiguous?
答案 1 :(得分:2)
如果向量中的元素保证是连续的,那么我认为我们可以做这样的指针算法......
向量中的元素保证是连续的,你确实可以使用这样的指针算法。
但是,有一点需要注意:addressof运算符可以重载以返回除地址之外的其他内容。如果您无法保证不会超载,请改用std::addressof
。
或者只使用Ivan所示的std::vector::data
。