gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:11:55 24 4
gpt4 key购买 nike

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)是:

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 数组尝试过这个运算符,在那种情况下它工作得很好。但是在这个问题中,在 vector 中列出它不起作用。

最佳答案

您的 [] 执行以下操作:

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

如果在列表中找不到键,它会创建一个本地条目,将该条目复制到列表的拷贝中,删除哈希 vector 中与键对齐的列表,将列表复制回哈希 vector ,然后返回对本地条目的引用。然后销毁本地条目,就像列表的拷贝一样。

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

您需要温习值和引用之间的区别,并注意生命周期和拷贝。

citylist 更改为引用。

删除函数底部的删除/插入。

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

关于c++ - C++中的数组下标运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31094061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com