【问题标题】:C++ unordered_map doesn't find values from command line argumentsC++ unordered_map 找不到命令行参数的值
【发布时间】:2013-11-24 03:11:32
【问题描述】:

我正在开发一个涉及元素周期表的 C++ 程序。我有一个Table 类,其中包含一个向量,其中包含指向所有元素对象的指针和一个将元素名称和符号转换为原子序数的 unordered_map。它重载了 [] 运算符,以便Table[const char*] 返回一个指向具有指定名称或符号的元素的指针。如果我将名称或符号硬编码到像Table["H"] 这样的调用中,这很好用,但是如果我像./program H 这样调用程序并尝试Table argv[1],即使H 在表中并且@ 也会出现out_of_range 错误987654326@ 工作正常。为什么当符号是命令行参数时它不按符号查找元素,而当符号是硬编码时它会这样做?

这是我的代码,其中只有一个元素以使其尽可能简单:

#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;

}

【问题讨论】:

  • 离题,但是:给你的变量起有意义的名字。密度是“密度”或至少是“rho”。稍后谢谢我;)

标签: c++ command-line-arguments unordered-map


【解决方案1】:

两个const char *s 不相等,因为一个指向一个常数而另一个不指向。由于您使用指针对地图进行了索引,因此find 成功的指针必须相等。相反,请使用 std::string 为地图编制索引,以便相等的字符串定位该元素。

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2016-12-22
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多