📜  C++标准模板库(STL)中的多图(1)

📅  最后修改于: 2023-12-03 14:59:52.050000             🧑  作者: Mango

C++标准模板库(STL)中的多图

C++标准模板库(STL)是C++的一个核心组成部分,它提供了许多容器类和算法,这些类和算法大大简化了C++程序员的编程工作。其中,多图是STL提供的一个重要容器,本文将介绍多图的相关内容。

多图概述

多图是一种图容器,它可以存储多个有向图或无向图,并提供了一系列的操作函数。多图的定义形式为:

template<typename Key, typename Weight = int>
class MultiGraph {
public:
    // ...
};

其中,Key是图节点的类型,Weight是边的权重类型,默认为int类型。多图提供了以下操作函数:

  • bool add_node(const Key &key):添加一个节点,如果已存在则返回false
  • size_t node_size() const:获取节点数量。
  • bool add_edge(const Key &from, const Key &to, const Weight &weight = Weight{}):添加一条有向边或无向边。
  • bool del_edge(const Key &from, const Key &to):删除一条有向边或无向边。
  • bool exist_edge(const Key &from, const Key &to) const:判断一条有向边或无向边是否存在。
  • std::vector<Key> from(const Key &key) const:获取以指定节点为起点的所有节点。
  • std::vector<Key> to(const Key &key) const:获取以指定节点为终点的所有节点。
  • std::vector<std::pair<Key, Weight>> edges(const Key &key) const:获取以指定节点为起点的所有边,并返回对应节点和边的权重。
多图使用示例

下面是一个使用多图的示例程序:

#include <iostream>
#include <vector>
#include "MultiGraph.h"

int main() {
    MultiGraph<std::string, int> g;
    g.add_node("a");
    g.add_node("b");
    g.add_node("c");
    g.add_edge("a", "b");
    g.add_edge("b", "a");
    g.add_edge("a", "c", 2);
    g.add_edge("c", "b", 3);
    g.del_edge("a", "b");
    std::vector<std::string> nodes = g.from("a");
    std::vector<std::pair<std::string, int>> edges = g.edges("c");
    std::cout << "node_size = " << g.node_size() << std::endl;
    std::cout << "edges from c:" << std::endl;
    for (auto iter = edges.begin(); iter != edges.end(); ++iter) {
        std::cout << iter->first << " " << iter->second << std::endl;
    }
    std::cout << "nodes from a:" << std::endl;
    for (auto iter = nodes.begin(); iter != nodes.end(); ++iter) {
        std::cout << *iter << std::endl;
    }
    return 0;
}

上述程序定义了一个字符串类型的多图,并向其中添加了三个节点:“a”、“b”、“c”,以及四条边:“a”到“b”、“b”到“a”、“a”到“c”、“c”到“b”。然后,程序删除了一条边:“a”到“b”,并用fromedges函数获取了“a”的出边和“c”的入边。最后,程序输出了节点数和对应的节点/边信息。

程序运行结果如下:

node_size = 3
edges from c:
b 3
nodes from a:
c
多图适用情况

多图适用于需要存储多个有向图或无向图,并对其进行访问和操作的情况。多图的操作函数类别丰富,适用于多种场景,例如拓扑排序、最短路径、最小生成树等。

总结

多图是STL中一个重要的图容器,它提供了丰富的操作函数,适用于多种场景。使用多图可以大大简化C++程序员的编程工作。