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

bol*_*lov 3 c++ optimization iterator vector

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

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

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

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

Jon*_*ely 10

一个简单的指针是一个有效的迭代器类型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());
Run Code Online (Sandbox Code Playgroud)