21xrx.com
2024-12-27 20:44:50 Friday
登录
文章检索 我的文章 写文章
如何在C++中实现向后移动整个数组/向量?
2023-07-05 04:56:49 深夜i     --     --
C++ 数组 向后移动 向量 实现

在C++中,有时我们需要将整个数组或向量向后移动一定的步长。这种操作常见于循环移位算法等场景。本文将介绍两种具有代表性的实现方法,供读者参考。

## 方法一

方法一的思路是创建一个新数组/向量,然后将原数组/向量中后面的元素复制到该新数组/向量的前面,再将原数组/向量前面的元素复制到新数组/向量的后面。代码实现如下:


#include <iostream>

#include <vector>

using namespace std;

// 向后移动整个向量 vec,移动步长为 shift

void shift_vector(vector<int>& vec, int shift) {

  int len = vec.size();

  vector<int> new_vec(len);

  for (int i = 0; i < len - shift; ++i) {

    new_vec[i + shift] = vec[i];

  }

  for (int i = 0; i < shift; ++i) {

    new_vec[i] = vec[len - shift + i];

  }

  vec = new_vec;

}

int main() {

  vector<int> vec = 3;

  int shift = 2;

  shift_vector(vec, shift);

  for (int x : vec)

    cout << x << " ";

  

  return 0;

}

这段代码中,我们首先定义了一个新的向量 `new_vec`,然后将原向量中后面的元素复制到新向量的前面,原向量中前面的元素复制到新向量的后面,最后将新向量赋值给原向量。

需要注意的是,这种方法的时间复杂度为 $O(n)$,其中 $n$ 为数组/向量的大小。因此,在元素数量非常多的情况下,这种方法的性能可能会较差。

## 方法二

方法二的思路是通过反转两次实现。我们首先将原数组/向量中前面的元素和后面的元素交换位置,然后再分别反转前半部分和后半部分。这种方法的代码实现如下:


#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

// 向后移动整个向量 vec,移动步长为 shift

void shift_vector(vector<int>& vec, int shift) {

  int len = vec.size();

  reverse(vec.begin(), vec.begin() + len - shift);

  reverse(vec.begin() + len - shift, vec.end());

  reverse(vec.begin(), vec.end());

}

int main() {

  vector<int> vec = 3;

  int shift = 2;

  shift_vector(vec, shift);

  for (int x : vec)

    cout << x << " ";

  

  return 0;

}

这段代码中,我们利用了 STL 中的 `reverse()` 函数,将前半部分和后半部分都反转了一次。需要注意的是,这种方法的时间复杂度为 $O(n)$,其中 $n$ 为数组/向量的大小。因此,在元素数量非常多的情况下,这种方法的性能也可能会较差。

总之,在实际应用中,我们需要根据具体的情况选择合适的方法来实现向后移动整个数组/向量。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复