【问题标题】:How to make a variable name without creating an array in C++?如何在不在 C++ 中创建数组的情况下创建变量名?
【发布时间】:2011-12-11 04:07:55
【问题描述】:

如何在创建变量的地方创建变量名称,然后在括号中指定变量编号? (顺便说一句,我只是在猜测代码应该如何,以便您了解我想说的。)例如:

int var[5];
//create a variable var[5], but not var[4], var[3], var[2], etc.

那么,变量号必须能够被变量值访问:

int number = 5;
int var[number]; //creates a var[5], not a var[4], etc.
int var[2]; //creates a var[2], not a var[1], etc.
cout >>var[number];
number = 2;
cin << var[number];

如果我的“示例”偏离轨道,请提出其他建议。我需要类似的东西来运行我的游戏,因为我必须能够创建无限的子弹实例,但它们也会在某一时刻被销毁。

【问题讨论】:

  • 当您不想要序列中的其他元素时,使用数组有什么意义?
  • 你想要什么不清楚。 int var[5] 不会创建“var[5]”。 C/C++ 使用从零开始的索引,因此它只创建一个由 5 个整数组成的数组,索引从 0 到 4。另外,如果你只想要一个整数,那么不要创建一个数组。
  • 我不明白这个问题。为什么你只想要数组中的一个元素?为什么不只使用一个变量呢?
  • 您在寻找稀疏数组吗?
  • 您是否尝试动态创建名称为 var_1、var_2、var_3 等的变量?

标签: c++ arrays variables


【解决方案1】:

您似乎正在寻找std::map 提供的功能,这是一个用于将键映射到值的容器。

Documentation of std::map


使用示例

在下面的示例中,我们将值 123 绑定到整数键 4,并将值 321 绑定到键 8。然后我们使用 std::map&lt;int,int&gt;::const_iterator 迭代 std::map 中的键/值对命名为m

  #include <map>

  ...

  std::map<int, int> m;

  m[4] = 123;
  m[8] = 321;

  for (std::map<int, int>::const_iterator cit = m.begin (); cit != m.end (); ++cit)
    std::cout << cit->first << " -> " << cit->second << std::endl;

输出:

  4 -> 123
  8 -> 321

【讨论】:

  • 我试过你的代码,它成功了!但是,我在示例中使用了“int”,但我打算使用用户制作的变量,如类。我将如何使用您的方法声明一个类?
  • @Ripspace 如果您想在地图中使用用户定义的对象作为,则必须定义operator&lt;对于该类,或者为std::map 提供一个比较器作为第三个模板参数。您可以在this SO-question 下阅读更多相关信息
  • 我研究了半个小时的帖子,无法弄清楚。如果我给你一个班级“子弹”怎么办?你会写一个例子吗?
  • @Ripspace 您应该能够从链接线程的示例中解决问题,如果您遇到问题,this thread 中的答案很简单。
【解决方案2】:

看起来您想要可变长度数组,这不是 C++ 支持的。在大多数情况下,正确的解决方案是改用std::vector,如

int number = 42; // or whatever
std::vector<int> var(number);

您可以像在大多数情况下使用数组一样使用std::vector,并且可以获得很多额外功能。

【讨论】:

  • 我应该包含什么标题,因为我收到有关向量不是“std 成员”的错误。
  • @Ripspace #include &lt;vector&gt;
  • 变量创建后如何使用?我试过 var(number),但没有用。
【解决方案3】:

如果我正确理解了您想要的内容(我不确定我是否这样做),您希望能够创建一个存放对象的地方并根据某些索引号使用它们,但只创建特定的对象按需放入其中。您想要这样做是因为 1) 您不知道要创建多少对象或 2) 您不会使用每个索引号或 3) 两者兼而有之。

如果 (1),那么您可能应该只使用一个向量,它是一个类似数组的结构,当您向其中添加更多内容时,它会自动增长。查找 std::vector。

如果 (2),那么您可以使用指针数组并将所有值初始设置为 null,然后根据需要使用 new 创建对象。 (或者您可以使用第 3 部分中推荐的解决方案。)

如果 (3),那么您想使用某种形式的映射或哈希表。即使不是所有数字都在使用中,这些结构也可以让您按数字查找事物,并且会根据需要增长。我强烈推荐使用哈希表,但在 C++ 中,STL 中没有哈希表,因此您必须自己构建或在第三方库中查找。为方便起见,您可以使用 std::map,它是 STL 的一部分。它的作用基本相同,但速度较慢。一些 C++ 发行版还包括 std::hash_map。如果可用,则应使用它,因为它比 std::map 更快。

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 2012-06-25
    • 2013-06-23
    • 2018-03-27
    • 2018-10-09
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多