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

在 C++ 中,如何编写在指定位置翻转二维数组的函数?

如何解决在 C++ 中,如何编写在指定位置翻转二维数组的函数?

对于我在 C++ 中的 2d 数组,需要在某个位置翻转 2d 数组。我必须编写一个翻转数组的函数 敌人的例子, 之前:

double A[][2] = {{0,0},{1,1},{2,2},{3,3},{4,4},{5,5},{6,6},{7,7}}
                                         A     B     C       D

调用函数反转(或翻转):invert(A,8,3,4); 之后:

double A[][2] = { {0,7}}
                                            D      C        B      A

这是我尝试过的尝试

  • @param A 是当前游览中城市的位置 (x,y) 列表。
  • @param n 是 A 中城市的数量
  • @param start 是要反转的部分的开头索引。
  • @param len 是要反转(或翻转)的段的长度。
    void invert ( double A[][2],int n,int start,int len ) {
          int(*tmp)[2] = new int[][2];
          for(int i = 0; i >= A.length; i--){
               for(int j = 0; j >= A[i].length; j--){
                    if( i > start)
                        tmp = A[i][j];
                 }
           }
               for(i = start; i < A.length; i++)
                  for(j = start; j < A[i].length; j++){
                     while (i <= end){
                        tmp = A[i][j];
                   }
                }
       }

我的错误

  • 表达式必须具有类类型
  • 不能将 double 类型的值分配给“double(*)[2]”类型的实体
  • 无法确定重载函数“end”的目的是哪个实例

我很清楚我的代码中的大多数错误都显而易见,但我需要从某个地方开始。

解决方法

我承认,我不知道如何使用 2D C 数组来实现。我只能告诉你一个简单的方法。

首先,一般建议:命名您的东西。如果我只需要阅读您的代码才能看到您正在处理具有 x 和 y 坐标的城市位置,而不必阅读您的文本,那不是很好吗?

接下来,对于可调整大小的数组,您可以(/应该)使用 std::vector 代替 C 数组。 C 数组在传递给函数时衰减为指针。 C 数组将其大小作为其类型的一部分,但访问它很不方便(并且一旦衰减为指针就不可能)。手动调整动态 C 数组的大小也不是很有趣。

最终,“简单的方法”是使用现有算法。要反转范围内的元素,它是 std::reverse:

#include <iostream>  
#include <vector>
#include <algorithm>

struct location {
    int x;
    int y;
};

int main() {

    std::vector<location> cities{{0,0},{1,1},{2,2},{3,3},{4,4},{5,5},{6,6},{7,7}};
    for (const auto& loc : cities){
        std::cout << loc.x << " " << loc.y << "\n";
    } 
    std::cout << "\n";
    std::reverse(cities.begin()+ 3,cities.begin() + 7);
    for (const auto& loc : cities){
        std::cout << loc.x << " " << loc.y << "\n";
    } 
    
}

输出:

0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7

0 0
1 1
2 2
6 6
5 5
4 4
3 3
7 7

实际上对于一维 c-array 来说几乎是一样的。主要区别在于 c 数组没有 begin 作为成员。这会产生与上面相同的输出:

location cities2[] = {{0,7}};
for (const auto& loc : cities2){
    std::cout << loc.x << " " << loc.y << "\n";
} 
std::cout << "\n";
std::reverse(std::begin(cities2)+ 3,std::begin(cities2) + 7);
for (const auto& loc : cities2){
    std::cout << loc.x << " " << loc.y << "\n";
} 

如果你想把它包装在一个函数中,你需要处理衰减为指针的数组:

void my_reverse(location* loc,size_t len,size_t first,size_t last){
    std::reverse(loc + first,loc + last + 1);
}

(我选择 last 作为要反转的最后一个元素。请注意,该算法采用一个迭代器,指向最后一个要反转的元素之后的元素。

包含所有三个变体的完整示例:https://godbolt.org/z/WMdea7WP3

,

如果我知道它总是与 2 列数组一起使用,我就会这样编写函数

void invert(double cities[][2],int size,int start,int len) {
    if (size < 0 || len < 0)
        return;

    double tempCoordsX,tempCoordsY;
    int endPos = start + len - 1;

    for (int i = start; i < (start + len/2); i++) {
        int mirroredPos = (endPos - (i - start)) % size;

        tempCoordsX = cities[i][0];
        tempCoordsY = cities[i][1];
        cities[i][0] = cities[mirroredPos][0];
        cities[i][1] = cities[mirroredPos][1];
        cities[mirroredPos][0] = tempCoordsX;
        cities[mirroredPos][1] = tempCoordsY;
    }

}

我再说一遍:请为你的东西命名

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?