最近我需要将指针转换为迭代器。在SO上,我找到了这个答案:
https://stackoverflow.com/a/55687896/8212170
在其中,我不完全理解将指针转换为迭代器的语法:
itr = (std::vector<int>::iterator&)(*ptr); //cast pointer back to iterator
- 我看到一个显式的 C 样式转换,但我无法弄清楚视图绑定的含义:
iterator&)(*ptr)
- 即(*ptr)
在我们取消引用指针,获取值,但它是如何相关的iterator&
- 我不太明白它是什么语法,因为它看起来不像一个地址获取运算符。
如果任务是在容器中的特定位置插入,为什么问题的标题甚至提到某种“指针”尚不清楚。本质上,任务是将索引转换为迭代器。这个问题中提到的一些“指针”是从哪里来的?
不,您的方法不正确。什么是
Car_list.begin()._Ptr
以及为什么要尝试将转换应用于引用类型尚不清楚。这个有点垃圾您在谈论“列表或向量”。列表和向量是性质完全不同的容器,在特定索引处插入向量和列表的任务是性质完全不同的任务。
向量 (
std::vector
) 是支持高效索引访问的随机访问容器。因此,向量迭代器是随机访问迭代器。这样的迭代器支持高效的迭代器算法。容器的元素索引可以使用来自 iterator 的迭代器算法立即转换为相应的迭代器begin()
,即 只需使用二元运算符+
列表 (
std::list
) 是不支持高效索引访问的顺序(双链接)访问容器。列表迭代器不是随机访问迭代器。无法通过简单地应用 operator 将元素索引转换为相应的迭代器+
。唯一的方法是从开始到所需位置依次遍历容器的所有元素/迭代器,由于显而易见的原因,这通常是低效的。但是,如果您仍然想这样做,那么在标准库中可以使用函数std::advance
或std::next
函数
std::advance
或std::next
能够区分它们正在处理的迭代器类型。对于随机访问迭代器,他们将立即应用 operator+
,如第 4 点所示,即 在不需要时不会对容器元素执行低效的重新计算。这意味着,当使用向量时,也可以使用函数std::next
,如第 5 段中所述,并获得适用于两种容器类型的统一代码。但是,这并不意味着这些功能应该在任何地方都可以使用。这些函数实际上使您能够隐藏低效的代码。向量迭代器有一个 operator+ 重载,所以正确的做法是: