c++ - map<A, set<A*>> 与 set<A> 其中 A 包含 A* 的集合

标签 c++ c++11 stl

我想用 C++ 表示一个图。

我正在解析我的输入数据,这些数据是 (1) 节点和 (2) 节点之间的连接。

我的问题是关于保存节点和连接的数据结构:

我的第一种方法是我从 C 中了解到的一种链表,但使用的是 STL 容器: class A持有节点的名称和一个 std::set<A*>存储指向连接节点的指针。 像这样的东西(不可编译,只是想法的草稿):

class A
{
    private:
        std::string name;
        std::set<A*> links;

    public:
        // constr., destr., getter, setter, ...
};

我的第二个想法是 std::map<A, std::set<A*> >甚至 std::map<A, std::vector<A*> >在我看来,在这种情况下这是更好的方法。

当然是 class A在这种情况下将只包含名称:

class A
{
    private:
        std::string name;

    public:
        // constr., destr., getter, setter, ...
};

我的图表用数据填充一次,初始化后不会应用删除/插入/更新操作。

如果有更好的数据结构方法我没有提到,欢迎赐教:)

最佳答案

这种方法看起来更经济:

class A
{
    std::string name;
    std::vector<A*> links;
}

原因:

  1. map< A, vector > 必须保存 A 的拷贝(作为键),因此会增加内存需求,尤其是当名称很长且具有描述性时。

  2. 在遍历节点时,您在任何给定时间都知道当前 A,并且可以直接访问链接集/vector ;使用 map ,您必须查找链接的集合/vector ,这会浪费时间。

关于c++ - map<A, set<A*>> 与 set<A> 其中 A 包含 A* 的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18727650/

相关文章:

c++ - 如何将鼠标坐标转换为 "mm"

c++ - 如何在没有互斥实例的情况下正确编译 lock_guard<mutex> 构造函数?

c++ - C++0x什么时候发布?

c++ - 映射构造函数,同时在 C++ 中实现计数器

c++ - 如果派生类不包含静态数据,我是否需要为派生类实现自己的析构函数?

c++ - 将音频样本转换为可听文件格式

c++ - 用户空间内存碎片

c++ - clang vs gcc - 优化包括 operator new

c++ - 尝试返回具有嵌套结构的迭代器会出现 "does not name type"错误

c++ - 不能在函数声明中使用模板参数