当我今天经历stl时,我遇到了从arr[0],,..arr[n-1]
对我动态分配的数组进行排序的情况。我正在使用命令
#include<algorithm>
.
.
int *arr = new int[n]();
//loop to take user input for each arr[i]
sort(&arr[0],&arr[n])
上面的命令正在排序数组而没有任何错误,即使我已经分配了最多arr[n-1]
的内存。
以下命令正在排序到第n-1个元素。
#include<algorithm>
.
.
int *arr = new int[n]();
//loop to take user input for each arr[i]
sort(&arr[0],&arr[n-1])
'&arr[n]
'如何在第一个代码段中工作。
答案 0 :(得分:2)
STL算法使用&#34;半开&#34;范围。这意味着它包含第一个元素,并且最多可以 - 但不包括 - 最后一个元素。给出:
std::sort(&arr[0], &arr[n]);
sort函数会将元素从0
排序到n - 1
。它绝不会试图查看arr[n]
。
在C和C ++中,创建指向超出数组末尾的第一个元素的指针是合法的,但是你不能取消引用该指针。
将通话更改为:
std::sort(&arr[0], &arr[n-1]);
你引入了一个错误,因为这会在排序时忽略数组中的最后一个元素。
使用半开范围(或间隔)非常自然,因为数组的索引是从0开始的。
答案 1 :(得分:0)
数组在C ++中被索引为0。如果您有n
个元素,则第一个索引为0
,最后一个为n-1
。
它正在运行,因为它是未定义的行为。它可以做任何事情。通常情况是你只是用废话覆盖堆栈上的某个变量。如果它是正确的变量,这可以允许某人使用目标无意义重载该缓冲区并导致代码被执行。它被称为“缓冲区溢出”,你需要避免它们。