请问c++里面的2维数组,能用字符串作为行号或者列号吗?

g
gooog
楼主 (北美华人网)
int s[5][2] = {       {1, 2},       {1, 2},       {1, 2},       {1, 2}       } ;
现在想这样改变数组的值。 s["row3"]["col2"] = 102; s["row1"]["col1"] = 102;
row3对应的是第0行。 col2对应的是第0列
row1对应的是第3行。 col1对应的是第1列 s["row1"]["col1"] = s[3][1]
有时候, "col1", "col2", "col3"可能是特殊字符,比如“!”, "@", "*"等
总结: 问题就是希望c++的2维数组,能这样读取和改变元素, s[0]["@"], s[0]["!"]
map应该可以,就是代码复杂一些。


i
ismajia
确实想要用的话, 可以考虑试试看用宏定义 任何就可以用'字符串'了
扶苏
随便google c++ two dimensional array 就有
initialization int arr[4][2] = { {1234, 56}, {1212, 33}, {1434, 80}, {1312, 78} } ; print array #include<iostream> using namespace std; main( ) { int arr[4][2] = { { 10, 11 }, { 20, 21 }, { 30, 31 }, { 40, 41 } } ; int i,j; cout<<"Printing a 2D Array:\n"; for(i=0;i<4;i++) { for(j=0;j<2;j++) { cout<<"\t"<<arr[j]; } cout<<endl; } }
上面copy有一个错误,华人网不知道为什么显示出来不对。arr [ i ] [ j ] 不知道你的row3对应第0行是什么意思。理论上只要你的index在range里,叫什么名字都随便。但是index是必须integer type。不可以是string。如果你想要用string,试试map,把key设成string。
学cs的,google是你的好朋友。网上太多牛人,太多好的方法了。
m
mrw
Index就是整数,用string肯定不行 可以考虑typedef 整数到几个row1,2的名字里,这具体叫啥我也不记得了
扶苏
如果你需要用array存储数据(比如为了节约memory),可以写一个小程序把string换成integer index去access array (比如 input “row3”, output 0)。那么你就可以用string去call。方法是非常多样的。要看你的终极目的是什么。
c
claireliu
可以定义成map,如果没performance要求和不需要内存连续。map<string, map<string,int>>
N
NewID2017
enum Row {   row1 = 0,   row2,   row3, };
enum Column {   col1 = 0,   col2,   col3, };
这样就可以 s[row3][col2] = 102;

如果你row1要对应第3行, 可以调整enum的顺序。但是如果没有特殊的理由,不要这样做,会被人骂死

u
uscnc
“row3对应的是第0行。 col2对应的是第0列”
这么做是想给代码里埋地雷吗?
g
gooog
确实想要用的话, 可以考虑试试看用宏定义 任何就可以用''字符串''了

ismajia 发表于 2023-10-12 11:29

谢谢! 我开始也是这样做的。 #define "1" 0 #define "?" 1 #define "*" 2
但是s[0] ["?"] 好像不行。
补充:这个矩阵的列的名,是键盘上的每个字符。我在问题中用“col1”代替,实际中还包括其他ascii码。 比如“!”, "@", 等等。
我就是希望 s[0]["@"] s[0]["!"]能执行。
m
mrw
enum Row {   row1 = 0,   row2,   row3, };
enum Column {   col1 = 0,   col2,   col3, };
这样就可以 s[row3][col2] = 102;

如果你row1要对应第3行, 可以调整enum的顺序。但是如果没有特殊的理由,不要这样做,会被人骂死


NewID2017 发表于 2023-10-12 11:41

高手来了 赞👍
g
gooog
enum Row {   row1 = 0,   row2,   row3, };
enum Column {   col1 = 0,   col2,   col3, };
这样就可以 s[row3][col2] = 102;

如果你row1要对应第3行, 可以调整enum的顺序。但是如果没有特殊的理由,不要这样做,会被人骂死


NewID2017 发表于 2023-10-12 11:41

多谢!
如果col1,col2, col3, 都是比较不常见的字符,比如 !, @, * 这种情况该如何是好?
g
gooog
可以定义成map,如果没performance要求和不需要内存连续。map<string, map<string,int>>
claireliu 发表于 2023-10-12 11:37

map可以解决 "!", "@", 作为列名的问题。 谢谢!
g
gooog
“row3对应的是第0行。 col2对应的是第0列”
这么做是想给代码里埋地雷吗?
uscnc 发表于 2023-10-12 11:43

不是。
但是我的确读过一些代码这么做。是为了增加程序的不可阅读性。
m
mrw
不是。
但是我的确读过一些代码这么做。是为了增加程序的不可阅读性。
gooog 发表于 2023-10-12 11:56

自己读也费劲啊 伤敌一千,自损八百
有程序可以把你的code里的变量名全改的面目全非,同时你可以保留易读的版本
m
majia2023
不是。
但是我的确读过一些代码这么做。是为了增加程序的不可阅读性。
gooog 发表于 2023-10-12 11:56

故意这样做?这样的code在我司不可能通过code review