【问题标题】:Circular Array C++ move to right循环数组 C++ 向右移动
【发布时间】:2021-12-31 09:46:20
【问题描述】:
#include <iostream>
using namespace std;
void circularShift(int *vec, unsigned int shift);
int main()
{
    int vec[5] = { 0, 1, 5, 3, 4 };
    circularShift (vec, 4);
    return 0;
}
void circularShift (int *vec, unsigned int shift)
{
    int B[5];
    for (int i = 0; i<5;i++)
    {
        B[(i+shift)%5]=vec[i];
    }
    for(int i =0; i<5;i++)
    {
        cout<< B[i];
    }
}

我在 B 中有这个输出 15340,我想要 40153。 然后将此值保存到 vec。 最终输出 vec = 40153。 关于解决方案的任何想法

【问题讨论】:

  • 不要进行破坏问题(使问题变得更糟)的编辑 - 已恢复。

标签: c++ arrays


【解决方案1】:

首先,应用最重要的编程规则之一:Single Responsibility Principle

您的 shift 函数还会打印输出。这应该由不同的函数来完成。

另外,请注意,左移总是可以通过右移来完成。左移 $k$ 步与右移n-k 步相同。

在其他改进中,这是工作代码。确保不要盲目复制,而是能够理解并在有不清楚的地方提出问题。

#include <iostream>
#include <vector>

using std::cout;
using std::size_t;
using std::vector;

vector<int> circular_shift_left( vector<int> const& vec, size_t shift )
{
    const size_t N = vec.size();
    vector<int> result(N);
    for( size_t i = 0; i < N; ++i )
    {
        result[i] = vec[(i + shift) % N];
    }
    return result;
}

vector<int> circular_shift_right( vector<int> const& vec, size_t shift )
{
    return circular_shift_left(vec, (vec.size()-shift));
}

void print_vector( vector<int> const& vec )
{
    for( auto const& elem : vec )
    {
        std::cout << elem << " ";
    }
}


int main()
{
    vector<int> vec = { 0, 1, 5, 3, 4 };
    auto shifted_l = circular_shift_left(vec, 4);
    auto shifted_r = circular_shift_right(vec, 4);
    print_vector(shifted_l);
    cout << "\n";
    print_vector(shifted_r);
    return 0;
}

【讨论】:

    【解决方案2】:

    除了infinitzero的方法外,您还可以考虑为您的循环列表设计数据结构,以防止不必要的复制/移动。

    只有rotate方法的简单实现:

    template<typename T>
    class CircularVector {
    public:
        CircularVector() {}
        CircularVector(std::initializer_list<T> l) : data_(l) {}
    
        void rotate(int diff) {
            idx = (idx + diff) % data_.size();
        }
    
        auto print() const {
            for (int i = 0; i < data_.size(); i++) {
                std::cout << data_[(i + idx) % data_.size()] << " ";
            }
            std::cout << "\n";
        }
    
    private:
        std::vector<T> data_;
        size_t idx = 0;
    };
    
    int main() {
        CircularVector<int> arr = {1, 2, 3};
        arr.print();
    
        arr.rotate(2);
        arr.print();
        
        arr.rotate(-1);
        arr.print();
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2022-01-05
      • 2012-08-25
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多