【问题标题】:Shifting array elements +1移动数组元素 +1
【发布时间】:2019-11-19 13:48:40
【问题描述】:

我已经为 6 个元素创建了数组,我想在 0 索引处添加新元素并希望将所有 +1 移位,所以我如何在 for 循环中执行此操作或任何简单的方法来执行大数组

#include <iostream>
    using namespace std;

    main(){
        int shift;
        int shift2;
        int shift3;
        int shift4;
        int shift5;

        int array[6]={1,2,3,4,5};
        shift=array[0];
        shift2=array[1];
        shift3=array[2];
        shift4=array[3];
        shift5=array[4];

            array[1]=shift ;
                array[2]=shift2;
                    array[3]=shift3 ;
                        array[4]=shift4 ;
                            array[5]=shift5 ;

            array[0]=90;

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


            cout<<"array value at index "<<i<<" is "<<array[i]<<endl;


        }




    }

【问题讨论】:

标签: c++ arrays loops for-loop


【解决方案1】:

首先,您应该从最后一个移出所有数组项。之后,只需用索引 0 覆盖第一个数组项

#include <iostream>

int main() {
    const int ARRAY_SIZE = 6;
    int array[ARRAY_SIZE] = {1, 2, 3, 4, 5, 0};
    for(int idx = ARRAY_SIZE - 1; idx > 0; --idx)
    {
        array[idx] = array[idx - 1];
    }
    array[0] = 10;

    for(int idx = 0; idx < ARRAY_SIZE; ++idx)
    {
       std::cout << "Array value at index " << idx << " is " << array[idx] << std::endl;
    }
}

输出:

Array value at index 0 is 10
Array value at index 1 is 1
Array value at index 2 is 2
Array value at index 3 is 3
Array value at index 4 is 4
Array value at index 5 is 5

【讨论】:

    【解决方案2】:

    如果您阅读 memmove 和 memcpy 的不同之处,您可能会知道为什么使用 1 个临时文件对您不起作用。

    【讨论】:

      【解决方案3】:

      你可以std::rotate然后覆盖第一个元素

      #include <algorithm>
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int array[6] = { 1, 2, 3, 4, 5 };
          std::rotate(std::begin(array), std::prev(std::end(array)), std::end(array));
          array[0] = 90;
          for (const auto &el: array) {
              std::cout << el << '\n';
          }
      }
      

      输出:

      90
      1
      2
      3
      4
      5
      

      【讨论】:

        【解决方案4】:

        完成整数数组任务的一种简单方法是使用标准 C 函数memmove。例如

        #include <iostream>
        #include <cstring>
        
        int main() 
        {
            int array[] = { 1, 2, 3, 4, 5 };
            const size_t N = sizeof( array ) / sizeof( *array );
        
            std::memmove( array + 1, array, ( N - 1 ) * sizeof( int ) );
        
            array[0] = 90;
        
            for ( const auto &item : array ) std::cout << item << ' ';
            std::cout << '\n';
        
            return 0;
        }
        

        程序输出是

        90 1 2 3 4 
        

        另一种方法是使用标准算法,例如std::rotate

        #include <iostream>
        #include <iterator>
        #include <algorithm>
        
        int main() 
        {
            int array[] = { 1, 2, 3, 4, 5 };
            const size_t N = sizeof( array ) / sizeof( *array );
        
            std::rotate( std::begin( array ), std::prev( std::end( array ) ),
                                std::end( array ) );
        
            array[0] = 90;
        
            for ( const auto &item : array ) std::cout << item << ' ';
            std::cout << '\n';
        
            return 0;
        }
        

        程序输出是

        90 1 2 3 4 
        

        如果使用 for 循环,则使用标准函数 std::exchange 可以如下所示。

        #include <iostream>
        #include <utility>
        
        int main() 
        {
            int array[] = { 1, 2, 3, 4, 5 };
            const size_t N = sizeof( array ) / sizeof( *array );
        
            int tmp = 90;
        
            for ( size_t i = 0; i < N; i++ )
            {
                tmp = std::exchange( array[i], tmp );
            }
        
            for ( const auto &item : array ) std::cout << item << ' ';
            std::cout << '\n';
        
            return 0;
        }
        

        程序输出又是

        90 1 2 3 4 
        

        不使用任何标准函数,程序看起来像

        #include <iostream>
        
        int main() 
        {
            int array[] = { 1, 2, 3, 4, 5 };
            const size_t N = sizeof( array ) / sizeof( *array );
        
            for ( size_t i = N; i-- > 1;  )
            {
                array[i] = array[i-1];
            }
        
            array[0] = 90;
        
            for ( const auto &item : array ) std::cout << item << ' ';
            std::cout << '\n';
        
            return 0;
        }
        

        程序输出又是

        90 1 2 3 4 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-24
          相关资源
          最近更新 更多