对象作为无序映射的键

| 我在将类的对象放在无序映射中作为键时遇到问题 这是一个简单的示例:
class first
{
        string name;
        public:
        first(){}
        first(string nam):name(nam){}
        string get_name() const
        {
                return name;
        }
};

struct SampleTraits
{
        size_t operator()(const first &that) const
        {
                return tr1::hash<const char*>()(that.get_name().c_str());
        }

        bool operator()(const first &t1,const first &t2) const
        {
                return t1.get_name()==t2.get_name();
        }

};
typedef tr1::unordered_set<unsigned short> uset;
typedef tr1::unordered_map<first,uset,SampleTraits,SampleTraits> umap;

ostream& operator <<(ostream& out, uset &ust)
{
        for(uset::iterator it=ust.begin();it!=ust.end();++it)
                out<<\" \"<<*it;
}

int main()
{
        umap *mymap= new umap;
        string names,nm,n;
        cout<<\"\\nEnter 1st name: \";
        cin>>names;
        first obj(names);
        (*mymap)[obj].insert(100);
        (*mymap)[obj].insert(120);
        (*mymap)[obj].insert(112);

        cout<<\"\\nEnter 2nd name:\";
        cin>>nm;
        first obj2(nm);
        (*mymap)[obj2].insert(201);
        (*mymap)[obj2].insert(202);

        cout<<\"\\nEnter name which u want to search:\";
        cin>>n;

        first obj1(n);
        umap::iterator it=mymap->find(obj1);
        cout<<it->first.get_name();
        cout<<it->second;
        //delete mymap;
        /*
        for(umap::iterator it=mymap->begin();it!=mymap->end();it++)
        {
                cout<<it->first.get_name()<<\" \";
                cout<<it->second<<endl;
        }
        */
        return 0;
}
我的问题是,当iam tryin插入两个不同的对象并尝试显示它时,显示段错误。这种行为。 任何帮助将不胜感激!!这将对我的项目有很大的帮助...     
已邀请:
问题在于散列函数。它不能像您预期的那样使用指针类型,因为它使用指针来计算哈希值而不是其内容。使用std :: string可解决此问题。
return tr1::hash<string>()(that.get_name());
    
看起来您忘记了从运算符<<退出该用途。虽然,大多数编译器会针对此类函数发出警告,但仍必须对其进行编译,并且运行此类程序将导致不确定的行为。
ostream& operator <<(ostream & out, uset & ust)
{
    for(uset::iterator it=ust.begin();it!=ust.end();++it)
        out<<\" \"<<*it;

    return out;
}
    

要回复问题请先登录注册