2016-05-08 151 views
0

我正在阅读这个线程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并移动其余的元素以取代它们的位置?

+1

如果你想调整阵列中使用矢量数组类,但如果你只是想转移我可以送你这对你做这个代码。 –

+1

改为使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。它有'erase()'方法。 –

+0

@Bahman_Mokri如果代码比我的代码好,那么请是 – JGerulskis

回答

3

您可以使用std ::旋转和std ::填充:

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

+0

看起来不错,唯一的问题是我得到一个错误,说'没有重载函数的实例“std :: begin”与参数列表' – JGerulskis

+0

@JGerulskis匹配,也许你没有C++ 11兼容编译器,或者没有启用c + + 11支持。 – marcinj

0

使用这种功能,它只是删除旧,并通过转移细胞返回新的int数组的指针,我只想提东西shiftStartIndex就是要从直到阵列的上端移动这样的新大小数组将会是(size - shiftStartIndex),这样可以防止数组脱离索引,我希望这会很有用。

int *shiftArray(int *, int, int); 

int main() 
{ 
    int size = 6; 
    int *b = new int[size]{ 1, 2, 3, 4, 5, 6 }; 

    int shiftStartIndex = 3; 

    b = shiftArray(b, size, shiftStartIndex); 

    int newSize = size - shiftStartIndex; 

    for (int i = 0; i < newSize; i++) 
    { 
     cout << b[i] << " "; 
    } 

    cin.ignore(); 
    return 0; 
} 

int *shiftArray(int *arr, int size, int stIndex) 
{ 
    int *a = new int[size - stIndex]; 

    for (int i = 0; i < size - stIndex; i++) 
    { 
     a[i] = arr[i + stIndex]; 
    } 

    delete[] arr; 

    return a; 
} 
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); 
+0

注意:如果您希望主要保持数组完整,但将数组的部分视图呈现给某个函数,那么采用与此不同的方法会更好 –