列表向量中的错误

发布于 2025-01-22 20:05:42 字数 833 浏览 0 评论 0原文

我正在设计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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦纸 2025-01-29 20:05:42

auto lst = val [key%10000];是列表的副本。您可以修改副本,并且该副本在函数末尾停止存在。

除了:您无需手动搜索元素,有std :: list :: remove

void remove(int key) {
    val[key%10000].remove(key);        
}

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

void remove(int key) {
    val[key%10000].remove(key);        
}
辞取 2025-01-29 20:05:42

函数返回真实,好像2 a被删除。

那是因为您没有将其删除(至少不是从存储在val [key%10000]的列表中)。 auto lst = val [key%10000];创建存储在val [key%10000]的列表的副本,然后从该副本中删除元素。

您需要将其存储为参考auto&amp; lst = val [key%10000];

the function returns true as if 2 a was not removed.

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 at val[key%10000] and you remove the element from that copy.

You would need to store it as a reference auto &lst=val[key%10000];

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文