如何解决在 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 举报,一经查实,本站将立刻删除。