[英]Can std::vector<T>::iterator simply be T*?
简单的理论问题:一个简单的指针是std::vector
的有效迭代器类型吗?
对于其他容器(例如list,map),这是不可能的,但对于std::vector
,保证数据是连续的,所以我认为没有理由不这样做。
据我所知,一些实现(例如Visual Studio)对调试版本进行了一些安全检查。 但这是在UB领域,所以对于定义明确的行为,我认为没有区别。
除了一些检查(“修改”未定义的行为),使用类而不是简单的指针用于向量迭代器有什么好处吗?
一个简单的指针是
std::vector
的有效迭代器类型吗?
是。 还有std::basic_string
和std::array
。
使用类而不是简单的指针用于向量迭代器有什么好处吗?
它提供了一些额外的类型安全性,因此如下所示的逻辑错误无法编译:
std::vector<int> v;
int i=0;
int* p = &i;
v.insert(p, 1); // oops, not an iterator!
delete v.begin(); // oops!
std::string s;
std::vector<char> v;
// compiles if string and vector both use pointers for iterators:
v.insert(s.begin(), '?');
std::array<char, 2> a;
// compiles if array and vector both use pointers for iterators:
v.erase(a.begin());
是的,它可以是T*
,但是它有一些令人烦恼的属性,即std::vector<int>::iterator
的ADL关联命名空间不是 std::
! 所以swap(iter1, iter2)
可能无法找到std::swap
。
值得深思 - 迭代器类也可以通过索引而不是指针来实现
当然,当向量重新分配时,所有指针,引用和迭代器都会失效。
但至少对于迭代器来说,总是不必如此,如果迭代器持有一个索引+向量的指针,你可以创建非重新分配无效的迭代器, (*m_vector)[m_index]
返回(*m_vector)[m_index]
。 当向量消失或索引无效时,迭代器无效。 换句话说,只有当术语vec[i]
无效时,迭代器才是无效的,无论重新分配如何。
这是一个矢量迭代器的严格非标准实现,但基于类的迭代器而不是原始指针的优势却不大。
此外,UB没有说明在解除引用无效迭代器时应该发生什么。 抛出异常或记录错误属于UB。 这意味着执行绑定检查的迭代器明显变慢,但对于速度不重要的某些情况,“安全但速度慢的迭代器”可能比“不安全但快速迭代器”具有更多优势
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.