繁体   English   中英

可以std :: vector <T> :: iterator只是T *?

[英]Can std::vector<T>::iterator simply be T*?

简单的理论问题:一个简单的指针是std::vector的有效迭代器类型吗?

对于其他容器(例如list,map),这是不可能的,但对于std::vector ,保证数据是连续的,所以我认为没有理由不这样做。

据我所知,一些实现(例如Visual Studio)对调试版本进行了一些安全检查。 但这是在UB领域,所以对于定义明确的行为,我认为没有区别。

除了一些检查(“修改”未定义的行为),使用类而不是简单的指针用于向量迭代器有什么好处吗?

一个简单的指针是std::vector的有效迭代器类型吗?

是。 还有std::basic_stringstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM