繁体   English   中英

C ++中的数组下标运算符重载

[英]Array subscript operator overloading in C++

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数组尝试了该运算符,在这种情况下它可以完美地工作。 但是在这个问题上,在向量内列出是行不通的。

您的[]执行以下操作:

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

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

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

您需要梳理值和引用之间的区别,并注意生存期和副本。

更改citylist一个参考。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM