我正在处理涉及元素周期表的C++程序。我有一个Table
类,它带有一个指向所有元素对象的指针和一个将元素名称和符号转换为原子数字的unordered_map。它重载[]运算符,以便Table[const char*]
返回指向具有指定名称或符号的元素的指针。如果我将名称或符号硬编码为Table["H"]
这样的调用,但是如果我调用./program H
这样的程序并尝试Table argv[1]
,即使H在表中并且Table["H"]
正常工作,也会出现Out_of_range错误。为什么它在符号是命令行参数时没有按符号查找元素,但是当符号是硬编码时它会执行此操作?C++ unordered_map没有从命令行参数中找到值
这里是我的代码只有一个元素,以保持尽可能简单:
#include <stdio.h>
#include <vector>
#include <unordered_map>
#include <cstring>
#include <stdlib.h>
using namespace std;
class Element{
public:
const char* name;//name
const char* sym;//symbol
const int z;//atomic number
const double m;//atomic mass
const double p;//density
const double mP;//melting point
const double bP;//boiling point
const double c;//specific heat
const double eneg;//electonegativity
const int gp;//group
const int pd;//period
Element(const char* n,const char* s,const int an,const double am,
const double d,const double mp,const double b,
const double sh,const double e,const int g,const int pd):
name(n),sym(s),z(an),m(am),p(d),mP(mp),bP(b),c(sh),eneg(e),gp(g),pd(pd)
{}
Element(const Element& e):
name(e.name),sym(e.sym),z(e.z),m(e.m),p(e.p),mP(e.mP),bP(e.bP),c(e.c),
eneg(e.eneg),gp(e.gp),pd(e.pd)
{}
const Element& operator=(const Element& e){
return e;
}
};
Element ah("Surprise","Ah",0,0.0625,0.000001,4999 ,9998,999999,0,0,0);
Element* undiscovered=&ah;
class Table{
public:
vector<const Element*> E_n;//vector<Element> E_n;
unordered_map<const char*,int>E_ns;
const Element* operator[](int i){
return E_n[i];
}
const Element* operator[](const char* n){
try{
return E_n[E_ns.at(n)];
}catch(out_of_range e){
return undiscovered;
}
}
int size(){
return E_n.size();
}
void add(const Element& e){
while(E_n.size()<=e.z)E_n.push_back(undiscovered);
E_n[e.z]=&e;
E_ns[e.name]=e.z;
E_ns[e.sym]=e.z;
}
void print(){
puts("\n");
for(auto e:E_n){
printf("%3d %13s(%3s). m:%7.3f, p:%10f, mp:%7.2f, bp:%7.2f\n",e->z,e->name,e->sym,e->m,e->p,e->mP,e->bP);
}
}
};
Table Elements;
int main(int argc,char **argv){
int i;
Elements.add(Element("Hydrogen","H",1,1.008,0.00009,14.1,20.28,14.304,2.20,1,1));
i=Elements[argv[1]]->z;
if(!i)i=atoi(argv[1]);
if(!i){
printf("There is no element \"%s\".\n",argv[1]);
return 0;
}
printf("%f\n",Elements[i]->m);
return 0;
}
偏离主题,但尽管如此:给你的变量有意义的名字。密度是'密度'或至少'ρ'。感谢我;) – steffen