我使用以下代码在双端式中插入了一些数据。
int data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
deque<int> rawData (data, data + sizeof(data) / sizeof(int));
但我不明白这部分代码,
data + sizeof(data) / sizeof(int)
什么意思?
让我们一点一点地看。
data
是显示从何处开始的迭代器。 它是一个数组,但在 C 和 C++ 数组中衰减到任何挑衅的指针,因此它被用作指针。 从data
开始接收数据,并一直持续到结束迭代器。
开始迭代器高出一定量,因此可以表示为 data + <something>
,其中 <something>
是长度。 开始迭代器是一个被视为int *
的int []
,所以我们想找到以 int
s 为单位的长度。 (在 C 和 C++ 中,指针按指向类型的长度递增。
因此,数组的长度应sizeof(data) / sizeof(int)
。 sizeof(data)
是数组的总大小(以字节为单位)。 (这是数组和指针之间的区别之一:数组具有定义的大小,而指针指向可能是未知大小数组的开头。 sizeof(int)
是 int 的总大小(以字节为单位),因此商是以 int
s 为单位的 array
的总大小。
我们希望array
的大小以 int
s 为单位,因为array
衰减成int *
,因此data + x
指向内存位置 x int
s 过去的data
。 从开始和总大小,我们找到了 data
的结尾 ,因此我们从头到尾data
复制所有内容。
这是指向数组最后一个元素之外的虚构元素的指针。sizeof(data)/sizeof(data[0])
生成数组data
元素数。 deque
构造函数接受"第一个元素的迭代器"和"最后一个元素之外的迭代器"(这就是迭代器产生end()
)。此构造有效地计算.end()
迭代器将产生的结果相同。