C ++中

时间:2015-06-27 22:14:27

标签: c++ arrays operator-keyword subscript

int &HTable::operator[](const string &key){
    int hashVal = hash(key);
    list<City> citylist = _pht->at(hashVal);
    std::list<City>::iterator it = citylist.begin();
    for (; it != citylist.end(); it++){
        std::cout << "came_inside" << endl;
        City ob = (*it);
        if (ob.city == key){
            return ob.population;
        }
    }
    City newcity(key,0);
    citylist.push_front(newcity);
    _pht->erase(_pht->begin() + hashVal);
    _pht->insert(_pht->begin() + hashVal, citylist);
    return newcity.population;
}

我的课程是:

class HTable
{
    public:
        HTable( int );

        int &operator[ ]( const string & );
        void print ( ) const;
        int  size  ( ) const;

    private:
        int _size;
        vector< list< City > > *_pht;

        int hash( const string & ) const;
};

我的问题是当我尝试使用它时:

HTable fl_cities( n );                      // hash table with n lists

fl_cities["abcd"] = 1000;
fl_cities["abc"] = 111;
fl_cities["abcdefdf"] = 111;

cout << fl_cities["abc"] << endl;    // return 0
cout << fl_cities["abcdefdf"] << endl; // return 0
cout << fl_cities["abcd"] << endl;  // return 0

我没有得到预期值,它显示0,因为我分配0然后返回值。假设返回指针然后当我分配值时它应该去那里但它不起作用。

我用简单的int数组尝试过这个运算符,在这种情况下它运行得很好。但是在这个问题中,列出一个它不起作用的向量。

1 个答案:

答案 0 :(得分:1)

您的[]执行以下操作:

如果哈希键。然后,它复制该哈希处的元素列表,在那里搜索键,如果找到则返回引用,并销毁您创建的列表的副本。这将返回一个悬空引用,访问未定义。

如果无法在列表中找到密钥,它会创建一个本地条目,将该条目复制到列表副本中,删除与密钥对齐的哈希向量中的列表,将列表复制回哈希向量,然后返回对本地条目的引用。然后销毁本地条目,以及列表的副本。

读取对您销毁的本地条目的引用会导致未定义的行为。

您需要了解值和引用之间的差异,并注意生命周期和副本。

citylist更改为参考。

删除功能底部的擦除/插入。

在最后一行返回citylist.front().population