我正在處理涉及元素週期表的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