[英]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.