无论如何使用包含数组名称的字符串来访问/修改数组?
Posted
技术标签:
【中文标题】无论如何使用包含数组名称的字符串来访问/修改数组?【英文标题】:Is there anyway to access/modify an array using a string that contains the name of the array? 【发布时间】:2021-01-03 05:56:10 【问题描述】:假设我们有几个数组,分别称为“一”、“二”和“三”。有没有办法使用包含数组名称的字符串来访问/修改数组?例如,
int one[n];
int two[n];
int three[n];
string str = "one";
// str can be "one", "two", or "three"
// I wanna access/modify whatever array that str is the name of
【问题讨论】:
如果您尝试做这样的事情,有一个更好的方法来代替。 (听起来像是一个 XY 问题。)您认为这是一个解决方案的更高层次意图是什么? 这些数组都是同一类型的吗?请显示至少一个数组的声明。 @AryaMcCarthy:我建议如果您正在为编程语言编写解释器,这可能是一个非常合理的设计。 仅当您设计算法、编写代码并创建/使用相关数据结构时。字符串(存储在数组中)和内置于 C++ 核心语言中的变量名称之间没有这样的映射。根据您的需要,您可以使用标准库中的某些类型(例如地图)或功能集合(例如算法)来实现您所寻求的。但标准库的任何部分都不是专门为满足您的需求而设计的。 【参考方案1】:是的,这是可能的。但也可以,您必须编写代码以将名称作为字符串映射到您希望该名称引用的数组。
一个简单的版本是使用std::unordered_map
来完成任务:
std::vector<int> one, two, three;
std::unordered_map<std::string, std::vector<int> &> names
"one", one ,
"two", two ,
"three", three
;
std::string arrayName;
std::cin >> arrayName;
auto pos = names.find(arrayName);
if (pos == names.end())
std::cerr << "name not found\n";
else
auto & currentArray = pos->second;
// do something with the selected vector:
currentArray.push_back(1);
这不是经常出现,但有时会出现。一种明显的可能性是当您为某种编程语言编写解释器时。
在这种情况下,您通常会有一个稍微不同的结构。你会有这样的东西:
class Integer /* ... */ ;
class String /* ... */ ;
// ...
std::variant<Integer, String /* ... */ Variable;
std::unordered_map<std::string, Variable> symbol_table;
因此,我们指定一个类来对目标语言中的每种类型进行建模,然后有一个从名称到对象的符号表映射。
但也有一些语言实际上只有一种类型的变量,并且在它们完全支持其他类型的范围内,它是通过根据它们的方式从一种类型转换为其他任何类型用过的。在这种情况下,您可能会将所有变量存储为相同类型的对象。
【讨论】:
【参考方案2】:是否可以使用包含数组名称的字符串访问/修改数组?
不。 变量名是为了程序员的利益;到代码编译和执行时,变量名已经不存在了。
【讨论】:
以上是关于无论如何使用包含数组名称的字符串来访问/修改数组?的主要内容,如果未能解决你的问题,请参考以下文章