2013-11-23 76 views
0

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

} 
+0

偏離主題,但儘管如此:給你的變量有意義的名字。密度是'密度'或至少'ρ'。感謝我;) – steffen

回答

2

兩個const char * s爲不能因爲一個指向一個常數,等於和其他沒有。由於您使用指針爲地圖編制了索引,因此指針必須等於find才能成功。相反,使用std::string索引地圖,以便相同的字符串可以找到元素。

+0

我現在覺得有點傻... – hacatu