C++;-在需要类型迭代器的向量(或其他容器)构造函数中使用数组/指针。这怎么可能? 下面的文本来自C++在线课程。它表示向量类的构造函数 template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );

C++;-在需要类型迭代器的向量(或其他容器)构造函数中使用数组/指针。这怎么可能? 下面的文本来自C++在线课程。它表示向量类的构造函数 template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );,c++,arrays,pointers,vector,C++,Arrays,Pointers,Vector,我可以习惯,但我真的不明白为什么这是可能的。我想了解一下这个技巧 在本例中,我的问题(参见代码)是如何可以简单地放置数组地址而不是迭代器? 在上述代码中,int*类型的元素作为inputierator类型的参数放置。这使我困惑 因为数组将其元素存储在连续内存中。因此,如果您知道类型的大小,以及指向第一个元素的指针,就可以计算出所有剩余元素的地址 int values[10]; &values[5] == &values[0] + 5 // due to pointer arith

我可以习惯,但我真的不明白为什么这是可能的。我想了解一下这个技巧

在本例中,我的问题(参见代码)是如何可以简单地放置数组地址而不是迭代器?


在上述代码中,
int*
类型的元素作为
inputierator
类型的参数放置。这使我困惑

因为数组将其元素存储在连续内存中。因此,如果您知道类型的大小,以及指向第一个元素的指针,就可以计算出所有剩余元素的地址

int values[10];
&values[5] == &values[0] + 5 // due to pointer arithmetic
§5.7加法运算符

加法运算符+和-从左向右分组。通常对算术或枚举类型的操作数执行算术转换

对于加法,两个操作数都应具有算术或无范围枚举类型,或者一个操作数应为指向完全定义的对象类型的指针,另一个操作数应具有整数或无范围枚举 键入

对于减法,以下其中一项应适用:
-两个操作数都具有算术或非范围枚举类型;或
-两个操作数都是指向相同完全定义对象类型的cv限定或cv非限定版本的指针;或
-左操作数是指向完全定义的对象类型的指针,右操作数具有整数或无范围枚举类型

将具有整数类型的表达式添加到指针或从指针中减去时,结果具有指针操作数的类型。如果指针操作数指向数组对象的某个元素,且数组足够大,则结果将指向与原始元素偏移的元素,从而生成的数组元素与原始数组元素的下标之差等于整数表达式。换句话说,如果表达式P指向数组对象的第i个元素,则表达式(P)+N(相当于N+(P)) 和(P)-N(其中N的值为N)分别指向i+N-th和i− 数组对象的第n个元素,前提是它们存在。此外,如果表达式P指向数组对象的最后一个元素,表达式(P)+1指向数组对象的最后一个元素,如果表达式Q指向数组对象的最后一个元素,则表达式(Q)-1指向数组对象的最后一个元素。如果指针操作数和结果都指向同一数组对象的元素,或超过数组对象最后一个元素的元素,则计算不应产生溢出;否则,行为是未定义的

因此,基本上,标准定义了指针
T*
和整数类型之间的算术

T* t + n  // where n is an offset (of integral type)

为了产生另一个
T*
,即
n*sizeof(T)
,从初始
T

开始,所有的故事都是关于构造对迭代器的期望。它希望能够增加它(使用++),以遵从它(使用*)。interator只是一个重载++和*运算符的类,或者是一个自然支持这两种操作的基本指针类型。

要回答上一个问题,指针指向内存中的某个位置。由于内存是随机访问的,指针可以分类为具有随机访问的。迭代器具有相同类型的分类。有一个很好的布局,显示哪种类型的迭代器支持什么。有了它,我们可以看到输入迭代器是最低的类型,它们可以执行最少的操作。由于指针与随机访问迭代器相同,并且随机访问迭代器可以完成输入迭代器所能完成的一切,因此这没有任何问题

如果这是另一种方式,并且您有一个函数需要一个随机访问迭代器,并且您提供了一个前向迭代器,那么无法保证代码能够工作。这是因为函数可能依赖于某个随机访问迭代器可以执行的操作,而前向迭代器无法执行


通常,在编写这种类型的代码并指定所需的迭代器类型时,需要指定允许代码编译的最小类型。只打印内容的东西只需要一个前向迭代器,因为您只需要遍历排序需要随机访问的内容。

C++迭代器实际上经过精心设计,用于概括指针的语义并模拟其语法(因此,
操作符*
重载)

<>参见最近的C++版本的处理或一般性讨论,特别注意:

  • 指针满足随机访问迭代器的所有要求
  • RandomAccessIterator为InputIterator需求的超集建模
  • 唯一需要的是InputIterator

  • 如果你真的不相信#1,你可能也有兴趣明确地看到标准库,如果你在那之后仍在挣扎,看看构造函数的实现,并向自己保证它的参数上的所有操作都是针对指针的格式良好。

    和(在)值之间的相等比较中,感谢布鲁诺,我在问题的最后补充了一点,这仍然让人困惑。在这种情况下,
    type
    ing是如何工作的?STL vector类有一个构造函数模板向量(迭代器优先,迭代器最后){…使用first、++first、*first做一些事情,比较first和last}。诀窍在于它是模板类(元素类型有参数)中的模板构造函数(迭代器有参数)。注意,*迭代器应该是元素t
    T* t + n  // where n is an offset (of integral type)