C++ 在模式的函数搜索中引用二维数组时出错 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 模板 int搜索模式(int(&grid)[num\u rows][num\u cols],int indexR,int indexC,int(&pattern)[patR][patC]){ 对于(int m=0,i=indexR;mR>>C; 字符串*arry=新字符串[R]; int**int_arry=新int*[R]; 对于(int i=0;iws,arry[i]);//cin>>ws去掉前导空格 //首先让getline不会认为它已经 //到达终点 //它似乎不接受上面的输入字符串 } 对于(int i=0;i
C++ 在模式的函数搜索中引用二维数组时出错 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 模板 int搜索模式(int(&grid)[num\u rows][num\u cols],int indexR,int indexC,int(&pattern)[patR][patC]){ 对于(int m=0,i=indexR;mR>>C; 字符串*arry=新字符串[R]; int**int_arry=新int*[R]; 对于(int i=0;iws,arry[i]);//cin>>ws去掉前导空格 //首先让getline不会认为它已经 //到达终点 //它似乎不接受上面的输入字符串 } 对于(int i=0;i,c++,arrays,C++,Arrays,int\u arry不是ints的二维数组。它是int*s的数组 这不是一回事 int[x][y]: #include <iostream> #include <string> #include <vector> #include <stdio.h> #include <sstream> using namespace std; template <int num_rows, int num_cols, int patR,
int\u arry
不是int
s的二维数组。它是int*
s的数组
这不是一回事
int[x][y]:
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <sstream>
using namespace std;
template <int num_rows, int num_cols, int patR, int patC>
int search_for_pattern(int (&grid)[num_rows][num_cols], int indexR, int indexC, int (&pattern)[patR][patC]){
for(int m = 0, i = indexR; m < patR && i < num_rows; m++, i++){
for(int n = 0, j = indexC; n < patC && j < num_cols; n++, j++){
if(grid[i][j] != pattern[m][n]){
return 0;
}
}
}
return 1;
}
int main(){
int T;
cin>>T;
while(T--){
int R, C;
cin>>R>>C;
string* arry = new string[R];
int** int_arry = new int*[R];
for(int i = 0; i < R; ++i)
int_arry[i] = new int[C];
for(int i = 0; i < R; i++){
getline(cin>>ws, arry[i]); //cin >> ws gets rid of leading whitespace
//first so that getline won't think that it's already
//reached the end of the line
//It doesn't seem to take the above input string
}
for(int i = 0; i < R; i++){
for(int j = 0; j < arry[i].length(); j++){
int_arry[i][j] = (int)(arry[i][j] - '0');
//cout<<int_arry[i][j]<<" ";
}
//cout<<endl;
}
//Pattern Array input
int pattern_R, pattern_C;
cin>>pattern_R>>pattern_C;
string* pattern_arry = new string[pattern_R];
int** int_pattern_arry = new int*[pattern_R];
for(int i = 0; i < pattern_R; ++i)
int_pattern_arry[i] = new int[pattern_C];
for(int i = 0; i < pattern_R; i++){
getline(cin>>ws, pattern_arry[i]);
}
for(int i = 0; i < pattern_R; i++){
for(int j = 0; j < pattern_arry[i].length(); j++){
int_pattern_arry[i][j] = (int)(pattern_arry[i][j] - '0');
// cout<<int_pattern_arry[i][j]<<" ";
}
//cout<<endl;
}
int flag = 0, patternTrue = 0;
for(int i = 0; i <= R - pattern_R; i++){
for(int j = 0; j <= C - pattern_C; j++){
if(int_arry[i][j] == int_pattern_arry[i][j]){
flag = 1;
patternTrue = search_for_pattern(int_arry, i, j, int_pattern_arry);
if(patternTrue){
cout<<"YES";
break;
}
}
}
if(patternTrue) break;
cout<<endl;
}
if(flag == 0){
cout<<"NO";
}
//Delete Grid
for(int i = 0; i < R; ++i) {
delete [] int_arry[i];
}
delete [] int_arry;
delete [] arry;
//Delete Pattern
for(int i = 0; i < pattern_R; ++i) {
delete [] int_pattern_arry[i];
}
delete [] int_pattern_arry;
delete [] pattern_arry;
cout<<endl;
}
return 0;
}
int(*)[y]
:
+-----+-----+-----+-----+-----+-----+
| int | int | int | int | int | int |
+-----+-----+-----+-----+-----+-----+
\___________/
\ x
\_________________________________/
y*x
正如你所看到的,这两者是完全不同的
如果您真的想要一个动态分配的“二维数组”,我建议使用一个大小为x×y的
std::vector
,并将二维访问包裹在其周围。这会容易得多。问题是您试图使用编译时未知的非常量值来初始化模板函数
模板总是在编译时创建的,所有必需的数据都必须在编译时可用
按以下方式调整搜索功能:
/ \
+------+------+------+
| int* | int* | int* |
+------+------+------+
| | ↓
| | +-----+-----+
| | | int | int |
| | +-----+-----+
| ↓
| +-----+-----+
| | int | int |
| +-----+-----+
↓
+-----+-----+
| int | int |
+-----+-----+
int search_for_pattern(int** grid, int grid_rows, int grid_cols, int** pattern, int pat_rows, int pat_cols, int indexR, int indexC) {
for (int m = 0, i = indexR; m < pat_rows && i < grid_rows; m++, i++) {
for (int n = 0, j = indexC; n < pat_cols && j < grid_cols; n++, j++) {
if (grid[i][j] != pattern[m][n]) {
return 0;
}
}
}
return 1;
}
是的,但我想使用分配2d动态数组并取消分配它的概念。@Sitansu:您不能分配2d动态数组;至少,在运行时两个维度都确定的情况下是这样的。我知道在这里使用向量会更好。.我正在使用向量再次尝试这一点。谢谢!这一推理并不是问题的答案尽管如此,提议的准则是有效的(如果不是最优的)。
patternTrue = search_for_pattern(int_arry, R, C, int_pattern_arry, pattern_R, pattern_C, i, j);