微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用向量在 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];

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。