【问题标题】:Is it possible to have functions run off the string within a variable rather than the variable name itself in C++? [closed]是否可以让函数从变量中的字符串而不是 C++ 中的变量名本身运行? [关闭]
【发布时间】:2020-08-18 12:42:10
【问题描述】:

这有点难以描述,但我基本上是在问我是否可以有一个调用myString 的函数,并且实际上将其中的字符串放入函数中。

到目前为止我的代码是:

for(uint n = 0; n < 5; n++) {
  int r = n * n;
  std::string R = std::to_string(n);
  std::string currentSquared = ("Squared" + R);
  int currentSquared.c_str() = r;
}

我知道这是错误的,我希望输出是一组变量,例如:

Squared1 = 1, Squared4 = 16.

任何帮助将不胜感激。

【问题讨论】:

  • Squared1 Squared4是什么?
  • c++ 中的变量名是严格的编译时间。您不能像这样从运行时字符串创建变量名。您可以只使用vector 来存储数据。
  • 这是XY Problem
  • 您在寻找std::unordered_mapstd::vector 还是std::array
  • Squared1 = 1, Squared4 = 16. 你可能想要一个数组而不是这个。 squared[0] =1; squared[3] = 16; 注意 c++ 数组索引从 0 而不是 1 开始。另外,如果您在计算之前不知道数组的大小,则 c++ 中的动态数组是 std::vector

标签: c++ string variables naming


【解决方案1】:

不,你不能像你描述的那样创建任意变量,除了在编译和调试过程中使用变量名之外,如果你在没有调试符号的情况下编译,它们会完全消失。

您需要在这里使用适当的数据结构来保存数据,而不是创建更多变量来使用,您可以阅读更多关于标准库容器的信息here

我建议在你的情况下使用std::vector

std::vector<int> numbers{};
numbers.reserve(10);
for(int i = 0; i < 10; ++i) {
    numbers.push_back(i * i);
}

std::cout << "Numbers squared:\n";
for (std::size_t i = 0; i < numbers.size(); ++i) {
    std::cout << i << '*' << i << " = " << numbers[i] << '\n';
}

std::vector 将负责为您存储所有数据,并且在大多数情况下应该是您作为容器的第一选择。

如果您想要一个允许您使用std::stringconst char* 来索引元素的字典,您也可以使用std::map

【讨论】:

    【解决方案2】:

    您可以在std::unordered_map 的帮助下创建密钥并从中收集数据:

    #include <iostream>
    #include <unordered_map>
    
    int main(void) {
      std::unordered_map<std::string, int> variables;
    
      // Initializing the map with their respective required keys
      for (int i{1}; i <= 10; i++)
        variables["Squared" + std::to_string(i)] = i * i;
    
      // Displaying one of the initialized key
      std::cout << variables["Squared4"];
    
      return 0;
    }
    

    因此,它会显示您想要的输出:

    16    // 'Squared4' key holds (4 * 4) = 16
    

    【讨论】:

    • +1 虽然这解决了 OP 要求的问题并且它会起作用,但它可能并不是真正需要的。 OP 更有可能真的想要其他解决方案。
    【解决方案3】:
    int main() {
    
        vector<string> mystring;
        for (int n = 0; n < 5; ++n) {
            int squared = n * n;
            string str_squared = to_string(squared);
            mystring.push_back(str_squared);
       }
    
        for (int j = 0; j < mystring.size(); ++j) {
            cout << mystring[j] << endl;
        }
       return 0;
    }
    

    我会尝试将我的字符串存储在一个容器中。在这种情况下,我使用了一个向量。这使我可以拥有一组 n 平方的字符串。为了显示它们,我可以在 for 循环中遍历我的向量。不确定这是否是您试图从您的问题中实现的目标。

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多