c++ - 扩展 std::unordered_set<> 以与 std::stack<> 一起使用

标签 c++ c++11 stl stack unordered-set

我的问题:我想使用 std::stack<std::pair<int,int>, std::unordered_set<std::pair<int,int>>

std::stack<coords, std::unordered_set<coords>>简称

我想知道是否可以延长 std::unordered_set<>这样它将在 std::stack<> 内正常运行. 除此之外,我想知道它是否值得付出努力,而不透露实际的最终用途。我的意思是,为了使用 unordered_set 的好处,用必要的方法设计我自己的模板会比扩展现有的 unordered_set 来满足要求更有效吗?

编辑:通常我会删除一个否定的问题,但我觉得这可能最终会对其他误解了 std::unordered_set 的可怜人有所帮助。话又说回来,我还没死,所以我很可能会删除它。

编辑 2:下面 AndreyT 的回答有助于找出原因 std::stack<std::pair<int,int>, std::unordered_set<std::pair<int,int>>不可能是一回事。我切换到 jxh 的答案,因为它基本上实现了一个并且接近我最终使用的答案。

最佳答案

正如已经在另一个答案中解释的那样,无序集不是堆栈接口(interface)的合适容器,因为提供的容器应该提供排序语义。无序集不提供排序语义,如其名称所示。

看起来你想要的是一个 LIFO 数据结构,但你希望能够在 O(1) 中找到该数据结构中的特定元素,并对其进行操作(我猜是找到并删除它)。

你可能做的最好的事情是你自己的数据结构,它有一个使用列表的堆栈,以及一个无序的坐标映射到该列表中的迭代器。

class MyFunkyStack {
    std::list<coord> list_;
    std::stack<coord, std::list<coord>> stack_;
    std::unordered_map<coord, std::list<coord>::iterator> map_;
    //...

    MyFunkyStack () : list_(), stack_(list_), map_() {}

    coord top () const { return stack_.top(); }

    void push (coord c) {
        stack_.push(c);
        map_[c] = list_.end() - 1;
    }

    void pop () { erase(top()); }

    void erase (coord c) {
        std::unordered_map<coord, std::list<coord>::iterator>::iterator i;
        if ((i = map_.find(c)) == map_.end()) return;
        list_.erase(i->second);
        map_.erase(i);
    }

    //...

};

向 B-52 道歉:
<上><下> 如果您在存档的系统日志中看到一条旧的日志行,上面写着:/ “哈希堆栈中的 15 MB”/ 哈希堆栈,是的,是的// 我正在下载一个开源项目。/ 寻找 hash-ay able-tay!/ 今天编译哈希表。// 我有一个 tar-ball,它对于电子邮件来说太大了。/ 我们正在为我的哈希堆栈下载它。// 我给了我一个编译器,它优化了很多,/ 所以赶快准备好您的构建盒吧!// Hash Stack 是我们一起制作的一个有点奇怪的容器。/ 哈希堆栈,宝贝(哈希堆栈宝贝!)// 哈希堆栈,宝贝,哈希堆栈!/ 哈希堆栈,宝贝,哈希堆栈!// (哈希,宝贝,这就是它所在的位置。)/ (哈希,宝贝,这就是它所在的位置。)// 许可证(哦!)是开源的伙计们!/ 因为哈希堆栈的共享很酷。// 这只是一个小类(class),只有几个领域。/ 这是一个奇怪的时髦堆栈,有点像 hack。// 不需要析构函数。/ 不需要赋值。/ 不需要移动或复制。/ 不需要赋值。// Hash Stack 是我们一起制作的一个有点奇怪的容器。/ 哈希堆栈,宝贝(哈希堆栈宝贝!)// (哈希,宝贝,这就是它所在的位置。)/ (哈希,宝贝,这就是它所在的位置。)// 打字和鼠标,/ 思考和编码,/ 几乎什么都没穿,/ 因为我在家工作(是的)。// 哈希堆栈编译!/ 哈希堆栈编译!// 哈希堆栈编译,/ 而其他堆栈仍然只是/ 数组,数组,数组,数组!// 其他堆栈只是插入,其他堆栈只是弹出,宝贝!/ 最后排队的是第一个出去的。// 其他堆栈只是插入,其他堆栈只是弹出,宝贝!/ 一个奇怪的时髦堆栈!/ 一个奇怪的时髦堆栈!// 当我编译时(依赖关系是陈旧的),我发送了一封电子邮件!// 我发布了一个新的“make”,在 -20 处重新发布,/ 所以快点,准备好你的构建盒!// Hash Stack 是我们一起制作的一个有点奇怪的容器。/ 哈希堆栈,宝贝(哈希堆栈宝贝!)// 哈希堆栈,宝贝,哈希堆栈!/ 哈希堆栈,宝贝,哈希堆栈!// (哈希,宝贝,就是它的位置,是的。)/ (哈希,宝贝,这就是它所在的位置。)// 测试,测试,测试,仍然没有核心,宝贝。/ 多试几个案例,宝贝/ 测试,测试,测试,仍然没有核心,宝贝。/ 你的测试计划是什么?// 测试,测试,测试,仍然没有核心,宝贝。/ 多试几个案例,糖/ 测试,测试,测试,仍然没有核心,宝贝。/ 你的测试计划是什么?// 测试,测试,测试,仍然没有核心,宝贝。/ (多试几个案例。)/ 测试,测试,测试,仍然没有核心,宝贝。// 测试一下! (有一个核心,宝贝!)/ 测试一下! (有一个核心!)/ 测试一下! (有一个核心,宝贝!)/ 测试一下!// 你做了什么?/ 转载,拦截!// 哈希堆栈,宝贝,哈希堆栈!/ (哈希,宝贝,就是它的位置,是的。)/ (哈希,宝贝,这就是它所在的位置。)// 哈希,宝贝,哈希堆栈!/ 打字和鼠标,/ 思考和编码,/ 在哈希堆栈上。

关于c++ - 扩展 std::unordered_set<> 以与 std::stack<> 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126910/

相关文章:

c++ - 如何使用卡片类的实例填充卡片组类? C++

c++ - undefined reference "typeinfo for <class>"

C++ 总是在构造函数中使用 Const 引用?

c++ - C++中是否允许自 move 对象?

c++ - 传一个容器给priority_queue有什么用

c++ - 释放基元 vector

C++ 复制构造函数调用

c++ - 具有 unique_ptr 的用户友好型 API

c++ - STL 中 boost::upgrade_to_unique_lock 的等价物是什么?

c++ - 使用STL算法计算绝对值之和