我正在阅读这篇帖子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
的结尾并移动其余元素以取代它们?
答案 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);
答案 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