列表向量中的错误
我正在设计C ++的标签。我将列表向量放在哈希键上。
class MyHashSet {
public:
vector<list<int>>val;
MyHashSet() {
val.resize(10000);
}
void add(int key) {
val[key%10000].push_back(key);
}
void remove(int key) {
auto lst=val[key%10000];
for(auto i=lst.begin();i!=lst.end();i++)
if(*i==key){lst.erase(i);return;}
}
bool contains(int key) {
auto lst=val[key%10000];
for(auto i=lst.begin();i!=lst.end();i++) if(*i==key)return true;
return false;
}
};
执行
MyHashSet a;
a.add(2);
a.remove(2);
cout<<a.contains(2)//it returns true somehow.
功能返回true,好像2
A没有被删除。我无法弄清楚代码有什么问题。
I am designing my HashSet in c++. I took vector of lists to hash the keys.
class MyHashSet {
public:
vector<list<int>>val;
MyHashSet() {
val.resize(10000);
}
void add(int key) {
val[key%10000].push_back(key);
}
void remove(int key) {
auto lst=val[key%10000];
for(auto i=lst.begin();i!=lst.end();i++)
if(*i==key){lst.erase(i);return;}
}
bool contains(int key) {
auto lst=val[key%10000];
for(auto i=lst.begin();i!=lst.end();i++) if(*i==key)return true;
return false;
}
};
Doing
MyHashSet a;
a.add(2);
a.remove(2);
cout<<a.contains(2)//it returns true somehow.
the function returns true as if 2
a was not removed. I cannot figure out what's wrong with the code.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
auto lst = val [key%10000];
是列表的副本。您可以修改副本,并且该副本在函数末尾停止存在。除了:您无需手动搜索元素,有
std :: list :: remove
auto lst=val[key%10000];
is a copy of the list. You modify the copy, and that copy ceases to exist at the end of the function.Aside: you don't need to manually search for the element, there is
std::list::remove
那是因为您没有将其删除(至少不是从存储在
val [key%10000]
的列表中)。auto lst = val [key%10000];
创建存储在val [key%10000]
的列表的副本,然后从该副本中删除元素。您需要将其存储为参考
auto&amp; lst = val [key%10000];
That's because you don't remove it (at least not from the list stored at
val[key%10000]
).auto lst=val[key%10000];
creates a copy of the list stored atval[key%10000]
and you remove the element from that copy.You would need to store it as a reference
auto &lst=val[key%10000];