能否通过字符串动态匹配变量名并直接操作变量?
关于通过字符串动态获取变量的问题
首先明确:C里没有原生支持通过字符串直接获取对应变量的机制。因为C是静态编译型语言,编译完成后,变量名会被编译器转换成内存地址,运行时根本不存在“变量名”这个概念,自然没法通过字符串去查找对应的变量。
不过你想要的“根据条件选择不同向量存数据”的需求,完全可以用更符合C++风格的方式实现,比你设想的字符串转变量更高效:
方案1:用数组存储向量引用
直接把vec0和vec1放到一个引用数组里,通过索引直接访问:
#include <vector> using namespace std; int main() { int n = 10; vector<int> vec0, vec1; // 用数组存储两个向量的引用 vector<int>& vecs[2] = {vec0, vec1}; for(int i = 0; i <= n; i++) { // 根据i%2的结果选择对应的向量 vecs[i % 2].push_back(i); } // 此时vec0存偶数,vec1存奇数 return 0; }
方案2:用std::array(更现代的写法)
如果喜欢C++标准库容器,可以用std::array来存储引用:
#include <vector> #include <array> using namespace std; int main() { int n = 10; vector<int> vec0, vec1; array<vector<int>&, 2> vecs = {vec0, vec1}; for(int i = 0; i <= n; i++) { vecs[i % 2].push_back(i); } return 0; }
额外提一句:动态映射的方式(不推荐此场景)
如果确实需要通过字符串来关联变量(比如变量数量不固定的场景),可以自己维护一个字符串到变量指针的映射,但这种方式有额外开销,对你这个需求来说没必要:
#include <vector> #include <map> #include <string> using namespace std; int main() { int n = 10; vector<int> vec0, vec1; map<string, vector<int>*> var_map; // 手动注册变量 var_map["vec0"] = &vec0; var_map["vec1"] = &vec1; for(int i = 0; i <= n; i++) { // 拼接字符串作为键,找到对应的向量指针 string var_name = "vec" + to_string(i % 2); var_map[var_name]->push_back(i); } return 0; }
另外补充:像Python、JavaScript这类动态语言,原生支持通过字符串获取变量,但C++作为静态语言,更倾向于在编译阶段确定所有变量的使用,以此换取更高的运行效率。
内容的提问来源于stack exchange,提问作者Dudu Dudu
相关产品推荐
相关产品推荐

