2013-11-23 26 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