使用向量在 C++ 中按 d 个元素向左旋转数组

问题描述

我写的C++函数代码:-

n=5(数组中的元素数)和 d=4(数组向左旋转的元素数)的值

vector<int> rotateLeft(int d,vector<int> arr) 
{
    int n=arr.size();
    vector<int> temp; 
    for(int i=0;i<d;i++)
    { temp[i]=arr[i]; }

    for(int j=d;j<n;j++)
    { arr[j-d]=arr[j]; }

    for(int k=0;k<d;k++)
    { arr[n-d-k]=temp[k];
    }
    return arr;
}

输入给定 arr[]= 1 2 3 4 5 需要输出arr[]=5 1 2 3 4

解决方法

您得到 Segmentation fault 有两个原因:

  • 在使用方括号访问元素之前,您必须调整 temp 的大小以匹配 arr,或者使用 std::vector<int> temp(n); 或之后调用 temp.resize(n)
  • 您犯了一个索引错误,导致访问越界:arr[n-d-k]=temp[k] 实际上应该是 arr[n-d+k]=temp[k]。为了避免这种情况,您可以尝试改用 .at(i) 运算符:它执行越界检查。

试试 here


标准库中还有一个名为 std::rotate 的函数。

 std::rotate(arr.begin(),arr.begin() + d,arr.end());

试试 here


如果我必须快速编写自己的版本,我实际上会做类似的事情

template <typename T>
std::vector<T> rotateLeft(std::vector<T> const& vec,int const d) {
  std::size_t const N = vec.size();
  std::vector<T> temp;
  temp.resize(N);
  for (std::size_t i = 0; i < N; ++i) {
    std::size_t const new_i = (N + i - d)%N;
    temp.at(new_i) = vec.at(i);
  }
  return temp;
}

试试 here

,
arr[n-d-k]=temp[k];

应该是

arr[n-d+k]=temp[k];