我正在尝试编写一个循环遍历数组的函数,并跳过给定的索引。例如。 如果有数组:
int Array[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
我希望输出跳过给定的索引。例如索引5,将跳过" 4"。并通过跳过" 4"或索引5来输出较小尺寸的数组。
0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
我跳过索引的当前函数如下所示:
void deleteArray(int original[], int origLen, int newArray[], int index){
for(int i = 0; i < origLen--; i++){
newArray[i] = original[i];
if(original[i] == index){
newArray[i] = original[i-1];
}
}
}
我试图遍历原始数组并复制其索引,直到它到达某个索引,然后跳过该给定索引,并创建一个新数组。基本上,将所有数组项移到左边,同时跳过从原始数组复制的新数组中的给定索引。
但是,在我的if语句中,我不确定如何跳过索引。我当前的代码用前一个索引替换索引。输出:
0, 1, 2, 3, 4, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
期望的输出:
0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
答案 0 :(得分:1)
首先,您的情况不正确:
if(original[i] == index){
您要将元素的值与所需的索引进行比较,而不是将索引本身(在本例中应为i
)进行比较。
一旦超过了所需的索引,你实际上希望新数组中的每个元素与原始数组中的前一个元素相同 - 而不仅仅是一个 - 所以你需要以某种方式处理它。我建议您保留一个布尔标记来跟踪您是否已超过索引,在这种情况下,将original[i-1]
分配给newArray[i]
;如果该标志为false,则代之以original[i]
newArray[i]
(正如您已经做过的那样)。
答案 1 :(得分:1)
您可以使用两个循环而不是使用一个循环来简化函数,并对循环的每次运行执行检查。
void deleteArray(int original[], int origLen, int newArray[], int index){
// Get everything up to index.
// When index is 5, get everything until i = 3
for(int i = 0; i < index-1; i++) {
newArray[i] = original[i];
}
// Now get everything after index.
for(int i = index; i < origLen; i++) {
newArray[i-1] = original[i];
}
}
答案 2 :(得分:1)
std :: copy it:
auto newArrayPosition = std::copy(original, original + index, newArray);
std::copy(original + index + 1, original + origLen, newArrayPosition);
答案 3 :(得分:1)
如果你总是知道你的新阵列会比原来的小一个元素,我建议你这样做:
int Array[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
int newArray[19];
然后
void deleteArray(int original[], int origLen, int newArray[], int index){
j = 0;
for(int i = 0; i < origLen; i++){
if(i == index){
continue;
}
newArray[j] = Array[i];
j++;
}
甚至你可以像这样写你的循环文章(如果你不想使用j):
for(int i = 0; i < origLen; i++){
if(i == index){
continue;
}
if (i < index){
newArray[i] = Array[i];
}
else {
newArray[i-1] = Array[i];
}
}
答案 4 :(得分:0)
我会保留两个计数器,一个用于插入位置,另一个用于读取位置:
void deleteArray(int original[], int origLen, int newArray[], int index){
int insertPos = 0;
for(int readPos = 0; readPos < origLen; readPos++){
// If this position is equal to the index we want to skip
if (readPos == index)
{
// continue onto next loop iteration
continue;
}
// Copy over the data
newArray[insertPos] = original[readPos];
// increment the counter
insertPos++;
}
}
就像其他人所说的那样,避免i < origLen--
,因为这非常复杂,实际上你甚至都没有解析整个数组,因为你一直在减少。