整数数组切片

时间:2016-05-08 18:38:15

标签: c++ arrays

我正在阅读这篇帖子Array slicing in c++并接近我正在寻找的内容但不完全正确。我想从int数组中删除前3个元素。

我现在拥有的东西:

void shiftArray(int *arr, int size) {
    for (int i = 0; i < size - 3; i++) {
        arr[i] = arr[i + 3];
        arr[i + 3] = -1; // can't re size array so set them to -1
    }
}

我想要的:

int* shiftArray(int *arr, int size) { // return type can stay void if possible
    return arr[3::]; // python
}

是否有可能采用非迭代方法将前三个元素移动到值-1的结尾并移动其余元素以取代它们?

3 个答案:

答案 0 :(得分:3)

您可以使用std :: rotate和std :: fill:

std::fill( std::rotate(arr, std::begin(arr) + 3, std::end(arr)), std::end(arr), -1);

http://coliru.stacked-crooked.com/a/b3e0557ee0481162

...但是,它不像php那么优雅: - )

[编辑]

以上要求下面的C ++ 11与旧的C ++标准版本兼容:

template<typename T, size_t n>
void left_shift(T (&arr)[n], size_t left_shift){
    assert(left_shift < n);
    std::fill( std::rotate(arr, arr + left_shift, arr + n), arr + n, -1);
}

left_shift(arr, 3);

http://coliru.stacked-crooked.com/a/c09c27e3ebd60952

答案 1 :(得分:1)

听起来你想使用可调整大小的数组就地删除前3个元素。

C ++中的可调整大小的数组称为std::vector。构造std::array和C样式数组不可调整大小。

在通用形式中,代码可以是:

template<size_t N, typename T>
void erase_start( std::vector<T> &arr )
{
    if ( arr.size() <= N )
        arr.clear();
    else
        arr.erase( arr.begin(), arr.begin() + N );
}

没有预先封装的矢量成员函数可以根据计数进行擦除,它只需要迭代器。但是你可以很容易地完成这样的功能。

调用可能如下所示:

std::vector<int> vec = { 1, 2, 3, 4, 5, 6, 7 };
erase_start<3>(vec);

答案 2 :(得分:0)

使用此函数它只是删除旧的函数并通过移位的单元格返回新的int数组指针,我只想提一下shiftStartIndex是你要从哪里转移到数组的末尾所以数组的新大小将是(size - shiftStartIndex)这会阻止数组退出索引,我希望这很有用。

pip install django-graphos-3