c++ - 两个 std::map 的值是彼此的迭代器?

标签 c++ dictionary incomplete-type

出于性能原因,我需要两个 std::map,它们的值指向彼此的元素。
这是为了在另一个元素已经遍历时允许恒定时间插入/删除一个元素。

在 C++ 中正确实现它的最快方法是什么?请注意,显而易见的方法不起作用,因为第二个映射的类型在其迭代器可以声明为第一个映射的值的类型之前是不完整的。是Variants我唯一的选择,还是有更好的解决方案?

最佳答案

据我所知,您希望相互递归类型无法通过(前向)声明实现。但是 C++ 提供了另一种方法,即著名的 CRTP:

#include <map>

template <typename T>
struct BidirMapHelper {
    struct ReverseElt {
        ReverseElt() {}
        ReverseElt(typename T::iterator p) : v(p) {}
        typename T::iterator v;
    };
    typedef std::map<int, ReverseElt> ReverseMap;
};

struct BidirMap: BidirMapHelper<BidirMap>
{
    struct DirectElt {
        DirectElt() {}
        DirectElt(ReverseMap::iterator p) : v(p) {}
        ReverseMap::iterator v;
    };
    typedef std::map<int, DirectElt> DirectMap;
    typedef DirectMap::iterator iterator;
};

typedef BidirMap::DirectMap DirectMap;
typedef BidirMap::ReverseMap ReverseMap;

int main () {
    DirectMap m1;
    ReverseMap m2;
    m1[0] = m2.end();
    m2[0] = m1.end();
    return 0;
}

这可以在 Linux 下使用 g++ 和 clang++ 干净地编译,但我必须承认我不确定它是否不依赖于标准库的实现特征,例如具有 SCARY 迭代器。

关于c++ - 两个 std::map 的值是彼此的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38325589/

相关文章:

c++ - 多次同时调用 uv_write 有时不起作用

c++ - modeltest + 简单表模式 = 父测试失败

c - 为什么一致性实现的行为会有所不同 w.r.t.具有内部链接的不完整数组类型?

C++ - 循环依赖(在模板化基类中使用子类的内部类型)

c++ - C++中的数据隐藏

c++ - c linux 和 windows 中的键盘扫描代码

c++ - 使用 HWLOC 的 NUMA 系统的 realloc()

java - 在 Java 8 中使用 Lambda 遍历一个 Map of Maps?

python - 排序和比较 Dicts Python 列表

python - 将嵌套字典写入 CSV,将长格式转换为宽格式