igraph 参考手册

用于使用 igraph C 库

搜索手册

第 11 章。顶点和边的选择器和序列,迭代器

1.  关于选择器,迭代器

除非另有明确说明,否则关于顶点和顶点选择器的所有内容也适用于边和边选择器。

顶点(和边)选择器的概念是在 igraph 0.2 中引入的。它是一种独立于图引用顶点或边的序列的方法。

虽然这听起来可能很神秘,但实际上非常简单。例如,图的所有顶点都可以通过 igraph_vs_all() 选择,图的独立性意味着 igraph_vs_all() 不由图对象参数化。也就是说,igraph_vs_all() 是选择图的所有顶点的通用概念。然后,顶点选择器是一种指定要访问的顶点类的方式。选择器可以指定要访问图的所有顶点或顶点的所有邻居。顶点选择器是一种说明你要访问一堆顶点的方式,而不是顶点迭代器,后者是访问特定图的每个选定顶点的具体计划。

要确定顶点选择器所暗示的实际顶点 ID,需要将选择顶点的概念应用于特定的图对象。这可以通过使用特定的顶点选择概念和特定的图对象实例化顶点迭代器来完成。顶点迭代器的概念可以以下列方式考虑。给定一个特定的图对象和要访问的顶点类,顶点迭代器是一个路线图、计划或路线,用于如何访问所选顶点。

一些顶点选择器具有立即版本。这些版本的前缀为 igraph_vss 而不是 igraph_vs,例如 igraph_vss_all() 而不是 igraph_vs_all()。立即版本用于 igraph 函数的参数列表中,例如 igraph_degree()。这些函数不与任何 igraph_vs_t 对象关联,因此它们没有单独的构造函数和析构函数(销毁函数)。

2. 顶点选择器构造函数

顶点选择器由顶点选择器构造函数创建,可以使用 igraph_vit_create() 实例化,并使用 igraph_vs_destroy() 销毁。

2.1. igraph_vs_all — 顶点集,图的所有顶点。

igraph_error_t igraph_vs_all(igraph_vs_t *vs);

参数: 

vs:

指向未初始化的 igraph_vs_t 对象的指针。

返回值: 

错误代码。

另请参阅: 

此选择器按递增的顶点 ID 顺序包括给定图的所有顶点。

时间复杂度:O(1)。

2.2. igraph_vs_adj — 顶点的相邻顶点。

igraph_error_t igraph_vs_adj(igraph_vs_t *vs,
                  igraph_integer_t vid, igraph_neimode_t mode);

此选择器选择给定顶点的所有相邻顶点。 mode 参数控制要选择的相邻顶点的类型。 从 igraph 0.4 版本开始,顶点按递增的顶点 ID 顺序访问。

参数: 

vs:

指向未初始化的顶点选择器对象的指针。

vid:

顶点 ID,邻域的中心。

模式:

决定有向图的邻域类型。 此参数对于无向图将被忽略。 可能的值

IGRAPH_OUT

所有从 vid 有有向边的顶点。 也就是说,vid 的所有出邻居。

IGRAPH_IN

所有从 vid 有有向边的顶点。 换句话说,vid 的所有入邻居。

IGRAPH_ALL

所有到 vid 或从 vid 有有向边的顶点。 也就是说,如果将图视为无向图,则 vid 的所有邻居。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

2.3. igraph_vs_nonadj — 顶点的非相邻顶点。

igraph_error_t igraph_vs_nonadj(igraph_vs_t *vs, igraph_integer_t vid,
                     igraph_neimode_t mode);

给定顶点的所有非相邻顶点。 mode 参数控制要选择的相邻顶点类型。 与 igraph_vs_adj() 选择 vid 的直接邻居不同,当前函数选择vid 直接邻居的顶点。

参数: 

vs:

指向未初始化的顶点选择器对象的指针。

vid:

顶点 ID,非邻域的中心

模式:

在有向图中不选择的邻域类型。 可能的值

IGRAPH_OUT

将选择除从 vid 有有向边的顶点之外的所有顶点。 也就是说,我们选择除 vid 的出邻居之外的所有顶点。

IGRAPH_IN

将选择除从有向边到 vid 的顶点之外的所有顶点。 换句话说,我们选择除 vid 的入邻居之外的所有顶点。

IGRAPH_ALL

将选择除与 vid 之间有有向边的顶点之外的所有顶点。 也就是说,我们选择 vid 的所有顶点,除了它的直接邻居。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

示例 11.1.  文件 examples/simple/igraph_vs_nonadj.c

#include <igraph.h>

int main(void) {

    igraph_t g;
    igraph_vs_t vs;
    igraph_vit_t vit;
    igraph_integer_t size;

    /* empty graph, all vertices */
    igraph_empty(&g, 10, IGRAPH_DIRECTED);
    igraph_vs_nonadj(&vs, 0, IGRAPH_ALL);
    igraph_vs_size(&g, &vs, &size);
    printf("%" IGRAPH_PRId " ", size);
    igraph_vit_create(&g, vs, &vit);
    while (!IGRAPH_VIT_END(vit)) {
        printf("%" IGRAPH_PRId " ", IGRAPH_VIT_GET(vit));
        IGRAPH_VIT_NEXT(vit);
    }
    printf("\n");

    igraph_vit_destroy(&vit);
    igraph_vs_destroy(&vs);
    igraph_destroy(&g);

    /* full graph, no vertices */
    igraph_full(&g, 10, IGRAPH_UNDIRECTED, IGRAPH_LOOPS);
    igraph_vs_nonadj(&vs, 0, IGRAPH_ALL);
    igraph_vit_create(&g, vs, &vit);
    while (!IGRAPH_VIT_END(vit)) {
        printf("%" IGRAPH_PRId " ", IGRAPH_VIT_GET(vit));
        IGRAPH_VIT_NEXT(vit);
    }
    printf("\n");

    igraph_vit_destroy(&vit);
    igraph_vs_destroy(&vs);
    igraph_destroy(&g);


    return 0;
}


2.4. igraph_vs_none — 空顶点集。

igraph_error_t igraph_vs_none(igraph_vs_t *vs);

创建空顶点选择器。

参数: 

vs:

指向未初始化的顶点选择器对象的指针。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

2.5. igraph_vs_1 — 具有单个顶点的顶点集。

igraph_error_t igraph_vs_1(igraph_vs_t *vs, igraph_integer_t vid);

此顶点选择器选择单个顶点。

参数: 

vs:

指向未初始化的顶点选择器对象的指针。

vid:

要选择的顶点 ID。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

2.6. igraph_vs_vector — 基于向量的顶点集。

igraph_error_t igraph_vs_vector(igraph_vs_t *vs,
                     const igraph_vector_int_t *v);

此函数可以暂时将 igraph_vector_int_t 作为顶点选择器处理。 顶点选择器应被视为向量的视图。 如果你更改向量,也会影响顶点选择器。 销毁顶点选择器不会销毁向量。 在销毁顶点选择器之前不要销毁向量,否则可能会出现奇怪的行为。 由于选择器未与任何特定图相关联,因此此函数不检查向量中的顶点 ID 是否有效。

参数: 

vs:

指向未初始化的顶点选择器的指针。

v:

指向 igraph_vector_int_t 对象的指针。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

示例 11.2.  文件 examples/simple/igraph_vs_vector.c

#include <igraph.h>

int main(void) {

    igraph_t g;
    igraph_vector_int_t v = IGRAPH_VECTOR_NULL;
    igraph_integer_t edges[] = { 0, 1, 1, 2, 2, 2, 2, 3, 2, 4, 3, 4 };
    igraph_vector_int_t v2;
    igraph_integer_t i;
    igraph_vit_t vit;
    igraph_vs_t vs;
    igraph_integer_t size;

    igraph_vector_int_view(&v, edges, sizeof(edges) / sizeof(igraph_integer_t));
    igraph_create(&g, &v, 0, IGRAPH_DIRECTED);

    /* Create iterator based on a vector (view) */
    igraph_vector_int_init(&v2, 6);
    VECTOR(v2)[0] = 0;
    VECTOR(v2)[1] = 2;
    VECTOR(v2)[2] = 4;
    VECTOR(v2)[3] = 0;
    VECTOR(v2)[4] = 2;
    VECTOR(v2)[5] = 4;

    igraph_vit_create(&g, igraph_vss_vector(&v2), &vit);

    i = 0;
    while (!IGRAPH_VIT_END(vit)) {
        if (IGRAPH_VIT_GET(vit) != VECTOR(v2)[i]) {
            return 1;
        }
        IGRAPH_VIT_NEXT(vit);
        i++;
    }
    if (i != igraph_vector_int_size(&v2)) {
        return 2;
    }

    igraph_vit_destroy(&vit);
    igraph_vector_int_destroy(&v2);

    /* Create small vector iterator */

    igraph_vs_vector_small(&vs, 0, 2, 4, 0, 2, 4, 2, -1);
    igraph_vit_create(&g, vs, &vit);
    igraph_vs_size(&g, &vs, &size);
    printf("%" IGRAPH_PRId " ", size);
    for (; !IGRAPH_VIT_END(vit); IGRAPH_VIT_NEXT(vit)) {
        printf("%" IGRAPH_PRId " ", IGRAPH_VIT_GET(vit));
    }
    printf("\n");

    igraph_vit_destroy(&vit);
    igraph_vs_destroy(&vs);

    /* Clean up */

    igraph_destroy(&g);

    return 0;
}


2.7. igraph_vs_vector_small — 通过给出其元素创建顶点集。

igraph_error_t igraph_vs_vector_small(igraph_vs_t *vs, ...);

此函数可用于创建具有一些顶点的顶点选择器。 不要忘记在最后一个顶点 ID 之后包含 -1。 如果你不正确地使用 -1,则该函数的行为是未定义的。

请注意,提供的顶点 ID 将解析为 int 类型的值,因此你不能在此处提供任意大的(对于 int 而言太大)顶点 ID。

参数: 

vs:

指向未初始化的顶点选择器对象的指针。

...:

其他参数,这些将是要包含在顶点选择器中的顶点 ID。 在最后一个顶点 ID 之后提供 -1

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(n),提供的顶点 ID 数。

2.8. igraph_vs_vector_copy — 基于向量的顶点集,带有复制。

igraph_error_t igraph_vs_vector_copy(igraph_vs_t *vs, const igraph_vector_int_t *v);

此函数可以永久地将 igraph_vector_int_t 作为顶点选择器处理。 顶点选择器创建原始向量的副本,因此可以在创建顶点选择器后安全地销毁向量。 更改原始向量不会影响顶点选择器。 顶点选择器负责删除自身制作的副本。 由于选择器未与任何特定图相关联,因此此函数不检查向量中的顶点 ID 是否有效。

参数: 

vs:

指向未初始化的顶点选择器的指针。

v:

指向 igraph_vector_int_t 对象的指针。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

2.9. igraph_vs_range — 顶点集,顶点的间隔。

igraph_error_t igraph_vs_range(igraph_vs_t *vs, igraph_integer_t start, igraph_integer_t end);

创建顶点选择器,其中包含顶点 ID 等于或大于 from 且小于 to 的所有顶点。 请注意,按照 C 约定,间隔从左侧闭合,从右侧打开。

参数: 

vs:

指向未初始化的顶点选择器对象的指针。

开始:

要包含在顶点选择器中的第一个顶点 ID。

end:

包含在顶点选择器中的第一个顶点 ID。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

示例 11.3.  文件 examples/simple/igraph_vs_range.c

#include <igraph.h>

int main(void) {

    igraph_vs_t vs;
    igraph_vit_t vit;
    igraph_t g;
    igraph_integer_t size;

    igraph_ring(&g, 10, IGRAPH_UNDIRECTED, 0, 1);
    igraph_vs_range(&vs, 0, 10);
    igraph_vit_create(&g, vs, &vit);
    igraph_vs_size(&g, &vs, &size);
    printf("%" IGRAPH_PRId "", size);

    while (!IGRAPH_VIT_END(vit)) {
        printf(" %" IGRAPH_PRId "", IGRAPH_VIT_GET(vit));
        IGRAPH_VIT_NEXT(vit);
    }
    printf("\n");

    igraph_vit_destroy(&vit);
    igraph_vs_destroy(&vs);
    igraph_destroy(&g);

    return 0;
}


3. 通用顶点选择器操作

3.1. igraph_vs_copy — 创建顶点选择器的副本。

igraph_error_t igraph_vs_copy(igraph_vs_t* dest, const igraph_vs_t* src);

参数: 

src:

正在复制的选择器。

dest:

一个未初始化的选择器,将包含副本。

3.2. igraph_vs_destroy — 销毁顶点集。

void igraph_vs_destroy(igraph_vs_t *vs);

当不需要顶点选择器时,应为所有顶点选择器调用此函数。 将释放为顶点选择器分配的内存。 不要对使用顶点选择器构造函数的立即版本(以 igraph_vss 开头)创建的顶点选择器调用此函数。

参数: 

vs:

指向顶点选择器对象的指针。

时间复杂度:取决于操作系统,通常为 O(1)。

3.3. igraph_vs_is_all — 检查是否包含所有顶点。

igraph_bool_t igraph_vs_is_all(const igraph_vs_t *vs);

此函数检查顶点选择器对象是否由 igraph_vs_all()igraph_vss_all() 创建。 请注意,顶点选择器可能包含给定图中的所有顶点,但如果它不是由此处提到的两个构造函数创建的,则返回值将为 false

参数: 

vs:

指向顶点选择器对象的指针。

返回值: 

如果顶点选择器包含所有顶点,则为 true,否则为 false

时间复杂度:O(1)。

3.4. igraph_vs_size — 返回顶点选择器的大小。

igraph_error_t igraph_vs_size(const igraph_t *graph, const igraph_vs_t *vs,
                   igraph_integer_t *result);

顶点选择器的大小是在迭代时将产生的顶点数。

参数: 

:

我们将迭代的图。

result:

结果将在此处返回。

3.5. igraph_vs_type — 返回顶点选择器的类型。

igraph_vs_type_t igraph_vs_type(const igraph_vs_t *vs);

4. 立即顶点选择器

4.1. igraph_vss_all — 图的所有顶点(立即版本)。

igraph_vs_t igraph_vss_all(void);

图中所有顶点的立即顶点选择器。 当应为所有顶点计算某些顶点属性(例如,介数、度等)时,可以方便地使用它。

返回值: 

图中所有顶点的顶点选择器。

另请参阅: 

时间复杂度:O(1)。

4.2. igraph_vss_none — 空顶点集(立即版本)。

igraph_vs_t igraph_vss_none(void);

空顶点选择器的立即版本。

返回值: 

空顶点选择器。

另请参阅: 

时间复杂度:O(1)。

4.3. igraph_vss_1 — 具有单个顶点的顶点集(立即版本)。

igraph_vs_t igraph_vss_1(igraph_integer_t vid);

单顶点选择器的立即版本。

参数: 

vid:

要选择的顶点。

返回值: 

包含单个顶点的顶点选择器。

另请参阅: 

时间复杂度:O(1)。

4.4. igraph_vss_vector — 基于向量的顶点集(立即版本)。

igraph_vs_t igraph_vss_vector(const igraph_vector_int_t *v);

这是 igraph_vs_vector 的立即版本。

参数: 

v:

指向 igraph_vector_int_t 对象的指针。

返回值: 

包含向量中顶点的顶点选择器对象。

另请参阅: 

时间复杂度:O(1)。

4.5. igraph_vss_range — 顶点间隔(立即版本)。

igraph_vs_t igraph_vss_range(igraph_integer_t start, igraph_integer_t end);

igraph_vs_range() 的立即版本。

参数: 

开始:

要包含在顶点选择器中的第一个顶点 ID。

end:

包含在顶点选择器中的第一个顶点 ID。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

5. 顶点迭代器

5.1. igraph_vit_create — 从顶点选择器创建顶点迭代器。

igraph_error_t igraph_vit_create(const igraph_t *graph, igraph_vs_t vs, igraph_vit_t *vit);

此函数使用给定的图实例化顶点选择器对象。 这是根据图从顶点选择器的逻辑概念创建实际顶点 ID 的步骤。 例如,使用 igraph_vs_all() 创建的顶点选择器包含所有顶点都包含在(尚未确定的)图中的知识。 实例化顶点迭代器对象时,将创建顶点迭代器对象,该对象包含作为参数提供的图中的实际顶点 ID。

同一顶点选择器对象可用于实例化任意数量的顶点迭代器。

参数: 

:

igraph_t 对象,图。

vs:

顶点选择器对象。

vit:

指向未初始化的顶点迭代器对象的指针。

返回值: 

错误代码。

另请参阅: 

时间复杂度:取决于顶点选择器类型。 对于使用 igraph_vs_all()igraph_vs_none()igraph_vs_1igraph_vs_vectorigraph_vs_range()igraph_vs_vector()igraph_vs_vector_small() 创建的顶点选择器,复杂度为 O(1)。 对于 igraph_vs_adj(),复杂度为 O(d),d 是要包含在迭代器中的顶点 ID 数。 对于 igraph_vs_nonadj(),复杂度为 O(|V|),|V| 是图中顶点的数量。

5.2. igraph_vit_destroy — 销毁顶点迭代器。

void igraph_vit_destroy(const igraph_vit_t *vit);

释放为顶点迭代器分配的内存。

参数: 

vit:

指向已初始化的顶点迭代器对象的指针。

另请参阅: 

时间复杂度:取决于操作系统,通常为 O(1)。

5.3.  步进顶点

使用 igraph_vit_create() 创建迭代器后,它指向由顶点选择器确定的顶点中的第一个顶点(如果有)。 IGRAPH_VIT_NEXT() 宏步进到下一个顶点,IGRAPH_VIT_END() 检查是否还有要访问的顶点,IGRAPH_VIT_SIZE() 给出了到目前为止已访问和要访问的顶点的总大小。 IGRAPH_VIT_RESET() 重置迭代器,它将再次指向第一个顶点。 最后,IGRAPH_VIT_GET() 给出了迭代器指向的当前顶点(仅当 IGRAPH_VIT_END() 为 false 时才调用它)。

以下是如何步进顶点 0 的邻居的示例

igraph_vs_t vs;
igraph_vit_t vit;
...
igraph_vs_adj(&vs, 0, IGRAPH_ALL);
igraph_vit_create(&graph, vs, &vit);
while (!IGRAPH_VIT_END(vit)) {
  printf(" %" IGRAPH_PRId, IGRAPH_VIT_GET(vit));
  IGRAPH_VIT_NEXT(vit);
}
printf("\n");
...
igraph_vit_destroy(&vit);
igraph_vs_destroy(&vs);

5.4. IGRAPH_VIT_NEXT — 下一个顶点。

#define IGRAPH_VIT_NEXT(vit)

将迭代器步进到下一个顶点。 仅当 IGRAPH_VIT_END() 返回 false 时才调用此函数。

参数: 

vit:

要步进的顶点迭代器。

时间复杂度:O(1)。

5.5. IGRAPH_VIT_END — 我们到结尾了吗?

#define IGRAPH_VIT_END(vit)

检查是否还有要步进的顶点。

参数: 

vit:

要检查的顶点迭代器。

返回值: 

逻辑值,如果为 true,则没有要步进的顶点。

时间复杂度:O(1)。

5.6. IGRAPH_VIT_SIZE — 顶点迭代器的大小。

#define IGRAPH_VIT_SIZE(vit)

给出顶点迭代器中顶点的数量。

参数: 

vit:

顶点迭代器。

返回值: 

顶点数。

时间复杂度:O(1)。

5.7. IGRAPH_VIT_RESET — 重置顶点迭代器。

#define IGRAPH_VIT_RESET(vit)

重置顶点迭代器。 调用此宏后,迭代器将指向第一个顶点。

参数: 

vit:

顶点迭代器。

时间复杂度:O(1)。

5.8. IGRAPH_VIT_GET — 查询当前位置。

#define IGRAPH_VIT_GET(vit)

给出迭代器指向的当前顶点的顶点 ID。

参数: 

vit:

顶点迭代器。

返回值: 

当前顶点的顶点 ID。

时间复杂度:O(1)。

6. 边选择器构造函数

6.1. igraph_es_all — 边集,所有边。

igraph_error_t igraph_es_all(igraph_es_t *es,
                  igraph_edgeorder_type_t order);

参数: 

es:

指向未初始化的边选择器对象的指针。

order:

常量,给出将边包含在选择器中的顺序。 可能的值

IGRAPH_EDGEORDER_ID

边 ID 顺序; 当前执行速度最快。

IGRAPH_EDGEORDER_FROM

顶点 ID 顺序,顶点的 id 对于有向图计数。 给定顶点的入射边的顺序是任意的。

IGRAPH_EDGEORDER_TO

顶点 ID 顺序,目标顶点的 ID 对于有向图计数。 给定顶点的入射边的顺序是任意的。

对于无向图,后两者相同。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

6.2. igraph_es_incident — 给定顶点上的入射边。

igraph_error_t igraph_es_incident(igraph_es_t *es,
                       igraph_integer_t vid, igraph_neimode_t mode);

参数: 

es:

指向未初始化的边选择器对象的指针。

vid:

顶点 ID,将选择它的入射边。

模式:

常量,给出要选择的入射边的类型。 对于无向图,此参数将被忽略。 可能的值:IGRAPH_OUT、传出边;IGRAPH_IN、传入边;IGRAPH_ALL、所有边。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

6.3. igraph_es_none — 空边选择器。

igraph_error_t igraph_es_none(igraph_es_t *es);

参数: 

es:

指向要初始化的未初始化的边选择器对象的指针。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

6.4. igraph_es_1 — 包含单个边的边选择器。

igraph_error_t igraph_es_1(igraph_es_t *es, igraph_integer_t eid);

参数: 

es:

指向未初始化的边选择器对象的指针。

eid:

要选择的边的边 ID。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

6.5. igraph_es_all_between — 边选择器,一对顶点之间的所有边 ID。

igraph_error_t igraph_es_all_between(
    igraph_es_t *es, igraph_integer_t from, igraph_integer_t to,
    igraph_bool_t directed
);

此函数采用一对顶点,并创建一个与这些顶点之间的所有边匹配的选择器。

参数: 

es:

指向未初始化的边选择器对象的指针。

:

源顶点的 ID。

:

目标顶点的 ID。

direectd:

是否应考虑边方向。 如果要从中选择的图是无向图,则这将忽略。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

6.6. igraph_es_vector — 将向量作为边选择器处理。

igraph_error_t igraph_es_vector(igraph_es_t *es, const igraph_vector_int_t *v);

创建边选择器,该选择器用作包含边 ID 的向量的视图。 在销毁边选择器之前,请勿销毁向量。 由于选择器未与任何特定图相关联,因此此函数不检查向量中的边 ID 是否有效。

参数: 

es:

指向未初始化的边选择器的指针。

v:

包含边 ID 的向量。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

6.7. igraph_es_range — 边选择器,边 ID 序列。

igraph_error_t igraph_es_range(igraph_es_t *es, igraph_integer_t start, igraph_integer_t end);

创建边选择器,其中包含边 ID 等于或大于 from 且小于 to 的所有边。 请注意,按照 C 约定,间隔从左侧闭合,从右侧打开。

参数: 

vs:

指向未初始化的边选择器对象的指针。

开始:

要包含在边选择器中的第一个边 ID。

end:

第一个 包含在边选择器中的边 ID。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

6.8. igraph_es_pairs — 边选择器,由向量中的端点定义的多个边。

igraph_error_t igraph_es_pairs(igraph_es_t *es, const igraph_vector_int_t *v,
                    igraph_bool_t directed);

给定顶点对之间的边将被包含在边选择中。顶点对必须在向量 v 中定义,向量的第一个元素是要选择的第一个边的第一个顶点,第二个元素是第一个边的第二个顶点,第三个元素是第二个边的第一个顶点,依此类推。

参数: 

es:

指向未初始化的边选择器对象的指针。

v:

包含边的端点的向量。

有向:

图是有向的还是无向的。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(n),n 是被选择的边的数量。

示例 11.4.  文件 examples/simple/igraph_es_pairs.c

#include <igraph.h>

int main(void) {

    igraph_t g;
    igraph_integer_t i;
    igraph_integer_t size;

    /* DIRECTED */

    igraph_star(&g, 10, IGRAPH_STAR_OUT, 0);

    for (i = 0; i < 100; i++) {
        igraph_es_t es;
        igraph_eit_t it;
        igraph_es_pairs_small(&es, IGRAPH_DIRECTED,
                              0, 1, 0, 2, 0, 5, 0, 2, 0, 3, 0, 4, 0, 7, 0, 9, -1);
        igraph_eit_create(&g, es, &it);
        igraph_es_size(&g, &es, &size);
        IGRAPH_EIT_RESET(it);
        while (!IGRAPH_EIT_END(it)) {
            (void) IGRAPH_EIT_GET(it);
            IGRAPH_EIT_NEXT(it);
            size--;
        }
        if (size != 0) {
            return 1;
        }
        igraph_eit_destroy(&it);
        igraph_es_destroy(&es);
    }

    igraph_destroy(&g);

    /* UNDIRECTED */

    igraph_star(&g, 10, IGRAPH_STAR_UNDIRECTED, 0);

    for (i = 0; i < 100; i++) {
        igraph_es_t es;
        igraph_eit_t it;
        igraph_es_pairs_small(&es, IGRAPH_DIRECTED,
                              0, 1, 2, 0, 5, 0, 0, 2, 3, 0, 0, 4, 7, 0, 0, 9, -1);
        igraph_eit_create(&g, es, &it);
        IGRAPH_EIT_RESET(it);
        while (!IGRAPH_EIT_END(it)) {
            (void) IGRAPH_EIT_GET(it);
            IGRAPH_EIT_NEXT(it);
        }
        igraph_eit_destroy(&it);
        igraph_es_destroy(&es);
    }

    igraph_destroy(&g);

    return 0;
}


6.9. igraph_es_pairs_small — 边选择器,多个边通过端点作为参数定义。

igraph_error_t igraph_es_pairs_small(igraph_es_t *es, igraph_bool_t directed, int first, ...);

给定顶点对之间的边将被包含在边选择中。顶点对必须作为函数调用的参数给出,第三个参数是第一个边的第一个顶点,第四个参数是第一个边的第二个顶点,第五个参数是第二个边的第一个顶点,依此类推。参数列表的最后一个元素必须是 -1,以表示参数列表的结束。

请注意,提供的顶点 ID 将被解析为 int,因此您不能在此处提供任意大的(对于 int 来说太大)顶点 ID。

参数: 

es:

指向未初始化的边选择器对象的指针。

有向:

图是有向的还是无向的。

...:

附加参数给出要包含在选择器中的边,作为顶点 ID 对。最后一个参数必须是 -1。 first 参数出于技术原因存在,表示第一个可变参数。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(n),n 是被选择的边的数量。

6.10. igraph_es_path — 边选择器,路径上的边 ID。

igraph_error_t igraph_es_path(igraph_es_t *es, const igraph_vector_int_t *v,
                   igraph_bool_t directed);

此函数接受一个顶点向量,并创建这些顶点之间的边的选择器。向量 {0, 3, 4, 7} 将选择边 (0 -> 3),(3 -> 4),(4 -> 7)。如果这些边不存在,则尝试使用此选择器创建迭代器将失败。

参数: 

es:

指向未初始化的边选择器对象的指针。

v:

沿着路径的顶点 ID 向量的指针。

有向:

是否应考虑边方向。 如果要从中选择的图是无向图,则这将忽略。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(n),n 是顶点的数量。

6.11. igraph_es_vector_copy — 边集合,基于向量,带有复制。

igraph_error_t igraph_es_vector_copy(igraph_es_t *es, const igraph_vector_int_t *v);

此函数使得可以将 igraph_vector_int_t 永久地作为边选择器处理。 边选择器创建原始向量的副本,因此在创建边选择器后可以安全地销毁向量。 更改原始向量不会影响边选择器。 边选择器负责删除自己创建的副本。 由于选择器不与任何特定图相关联,因此此函数不检查向量中的边 ID 是否有效。

参数: 

es:

指向未初始化的边选择器的指针。

v:

指向 igraph_vector_int_t 对象的指针。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

7. 立即边选择器

7.1. igraph_ess_all — 边集合,所有边(立即版本)。

igraph_es_t igraph_ess_all(igraph_edgeorder_type_t order);

所有边选择器的立即版本。

参数: 

order:

给出边选择器中边的顺序的常量。 请参阅 igraph_es_all() 获取可能的值。

返回值: 

边选择器。

另请参阅: 

时间复杂度:O(1)。

7.2. igraph_ess_none — 立即空边选择器。

igraph_es_t igraph_ess_none(void);

空边选择器的立即版本。

返回值: 

初始化的空边选择器。

另请参阅: 

时间复杂度:O(1)。

7.3. igraph_ess_1 — 单个边边选择器的立即版本。

igraph_es_t igraph_ess_1(igraph_integer_t eid);

参数: 

eid:

边的 ID。

返回值: 

边选择器。

另请参阅: 

时间复杂度:O(1)。

7.4. igraph_ess_vector — 立即向量视图边选择器。

igraph_es_t igraph_ess_vector(const igraph_vector_int_t *v);

这是边 ID 向量边选择器的立即版本。

参数: 

v:

边 ID 的向量。

返回值: 

初始化的边选择器。

另请参阅: 

时间复杂度:O(1)。

7.5. igraph_ess_range — 序列边选择器的立即版本。

igraph_es_t igraph_ess_range(igraph_integer_t start, igraph_integer_t end);

参数: 

开始:

要包含在边选择器中的第一个边 ID。

end:

第一个 包含在边选择器中的边 ID。

返回值: 

初始化的边选择器。

另请参阅: 

时间复杂度:O(1)。

8. 通用边选择器操作

8.1. igraph_es_as_vector — 将边选择器转换为向量。

igraph_error_t igraph_es_as_vector(const igraph_t *graph, igraph_es_t es,
                        igraph_vector_int_t *v);

在边选择器上调用此函数以将其转换为向量。 这仅适用于序列和向量选择器。 如果边在图中不存在,这将导致错误。

参数: 

:

指向图的指针,用于检查选择器中的边是否存在。

es:

边选择器对象。

v:

指向初始化的向量的指针。 结果将存储在此处。

时间复杂度:O(n),n 是选择器中边的数量。

8.2. igraph_es_copy — 创建边选择器的副本。

igraph_error_t igraph_es_copy(igraph_es_t* dest, const igraph_es_t* src);

参数: 

src:

正在复制的选择器。

dest:

一个未初始化的选择器,将包含副本。

另请参阅: 

8.3. igraph_es_destroy — 销毁边选择器对象。

void igraph_es_destroy(igraph_es_t *es);

当不再需要边选择器时,请在此边选择器上调用此函数。 不要 在由立即构造函数创建的边选择器上调用此函数,这些边选择器不需要销毁。

参数: 

es:

指向边选择器对象的指针。

时间复杂度:取决于操作系统,通常为 O(1)。

8.4. igraph_es_is_all — 检查边选择器是否包含所有边。

igraph_bool_t igraph_es_is_all(const igraph_es_t *es);

参数: 

es:

指向边选择器对象的指针。

返回值: 

如果 es 是使用 igraph_es_all()igraph_ess_all() 创建的,则为 true,否则为 false

时间复杂度:O(1)。

8.5. igraph_es_size — 返回边选择器的大小。

igraph_error_t igraph_es_size(const igraph_t *graph, const igraph_es_t *es,
                   igraph_integer_t *result);

边选择器的大小是在迭代时将产生的边的数量。

参数: 

:

我们将迭代的图。

result:

结果将在此处返回。

8.6. igraph_es_type — 返回边选择器的类型。

igraph_es_type_t igraph_es_type(const igraph_es_t *es);

9. 边迭代器

9.1. igraph_eit_create — 从边选择器创建边迭代器。

igraph_error_t igraph_eit_create(const igraph_t *graph, igraph_es_t es, igraph_eit_t *eit);

此函数基于边选择器和图创建边迭代器。

可以使用相同的边选择器来创建多个边迭代器,也可以用于不同的图。

参数: 

:

将实例化边选择器的 igraph_t 对象。

es:

要实例化的边选择器。

eit:

指向未初始化的边迭代器的指针。

返回值: 

错误代码。

另请参阅: 

时间复杂度:取决于边选择器的类型。 对于由 igraph_es_all(), igraph_es_none(), igraph_es_1(), igraph_es_vector(), igraph_es_range() 创建的边选择器,时间复杂度为 O(1)。 对于 igraph_es_incident(),时间复杂度为 O(d),其中 d 是顶点的关联边的数量。

9.2. igraph_eit_destroy — 销毁边迭代器。

void igraph_eit_destroy(const igraph_eit_t *eit);

参数: 

eit:

指向要销毁的边迭代器的指针。

另请参阅: 

时间复杂度:取决于操作系统,通常为 O(1)。

9.3.  步进遍历边

就像顶点迭代器一样,提供了用于步进遍历边序列的宏:IGRAPH_EIT_NEXT() 转到下一条边,IGRAPH_EIT_END() 检查是否还有更多边要访问,IGRAPH_EIT_SIZE() 给出边序列中边的数量,IGRAPH_EIT_RESET() 将迭代器重置为第一条边,IGRAPH_EIT_GET() 返回当前边的 ID。

9.4. IGRAPH_EIT_NEXT — 下一条边。

#define IGRAPH_EIT_NEXT(eit)

将迭代器步进到下一条边。 仅当 IGRAPH_EIT_END() 返回 false 时才调用此函数。

参数: 

eit:

要步进的边迭代器。

时间复杂度:O(1)。

9.5. IGRAPH_EIT_END — 我们到末尾了吗?

#define IGRAPH_EIT_END(eit)

检查是否还有更多边要步进。

参数: 

wit:

要检查的边迭代器。

返回值: 

逻辑值,如果为 true,则没有更多边要步进。

时间复杂度:O(1)。

9.6. IGRAPH_EIT_SIZE — 迭代器中边的数量。

#define IGRAPH_EIT_SIZE(eit)

给出边迭代器中边的数量。

参数: 

eit:

边迭代器。

返回值: 

边的数量。

时间复杂度:O(1)。

9.7. IGRAPH_EIT_RESET — 重置边迭代器。

#define IGRAPH_EIT_RESET(eit)

重置边迭代器。 调用此宏后,迭代器将指向第一条边。

参数: 

eit:

边迭代器。

时间复杂度:O(1)。

9.8. IGRAPH_EIT_GET — 查询边迭代器。

#define IGRAPH_EIT_GET(eit)

给出迭代器指向的当前边的边 ID。

参数: 

eit:

边迭代器。

返回值: 

当前边的 ID。

时间复杂度:O(1)。

10. 已弃用的函数

10.1. igraph_es_seq — 边选择器,边 ID 序列,带有包含端点(已弃用)。

igraph_error_t igraph_es_seq(igraph_es_t *es, igraph_integer_t from, igraph_integer_t to);

介于 fromto (包含)之间的所有边 ID 都将包含在边选择中。

警告

自 0.10.0 版本起已弃用。 请不要在新代码中使用此函数; 请改用 igraph_es_range()

参数: 

es:

指向未初始化的边选择器对象的指针。

:

要包含的第一个边 ID。

:

要包含的最后一个边 ID。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

10.2. igraph_ess_seq — 序列边选择器的立即版本,带有包含端点。

igraph_es_t igraph_ess_seq(igraph_integer_t from, igraph_integer_t to);

警告

自 0.10.0 版本起已弃用。 请不要在新代码中使用此函数; 请改用 igraph_ess_range()

参数: 

:

要包含的第一个边 ID。

:

要包含的最后一个边 ID。

返回值: 

初始化的边选择器。

另请参阅: 

时间复杂度:O(1)。

10.3. igraph_vs_seq — 顶点集合,带有包含端点的顶点区间(已弃用)。

igraph_error_t igraph_vs_seq(igraph_vs_t *vs, igraph_integer_t from, igraph_integer_t to);

创建一个顶点选择器,其中包含顶点 ID 大于或等于 from 且小于或等于 to 的所有顶点。 请注意,与 C 约定相反,两个端点都是包含的。

警告

自 0.10.0 版本起已弃用。 请不要在新代码中使用此函数; 请改用 igraph_vs_range()

参数: 

vs:

指向未初始化的顶点选择器对象的指针。

:

要包含在顶点选择器中的第一个顶点 ID。

:

要包含在顶点选择器中的最后一个顶点 ID。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。

示例 11.5.  文件 examples/simple/igraph_vs_range.c

#include <igraph.h>

int main(void) {

    igraph_vs_t vs;
    igraph_vit_t vit;
    igraph_t g;
    igraph_integer_t size;

    igraph_ring(&g, 10, IGRAPH_UNDIRECTED, 0, 1);
    igraph_vs_range(&vs, 0, 10);
    igraph_vit_create(&g, vs, &vit);
    igraph_vs_size(&g, &vs, &size);
    printf("%" IGRAPH_PRId "", size);

    while (!IGRAPH_VIT_END(vit)) {
        printf(" %" IGRAPH_PRId "", IGRAPH_VIT_GET(vit));
        IGRAPH_VIT_NEXT(vit);
    }
    printf("\n");

    igraph_vit_destroy(&vit);
    igraph_vs_destroy(&vs);
    igraph_destroy(&g);

    return 0;
}


10.4. igraph_vss_seq — 带有包含端点的顶点区间(立即版本,已弃用)。

igraph_vs_t igraph_vss_seq(igraph_integer_t from, igraph_integer_t to);

igraph_vs_seq() 的立即版本。

警告

自 0.10.0 版本起已弃用。 请不要在新代码中使用此函数; 请改用 igraph_vss_range()

参数: 

:

要包含在顶点选择器中的第一个顶点 ID。

:

要包含在顶点选择器中的最后一个顶点 ID。

返回值: 

错误代码。

另请参阅: 

时间复杂度:O(1)。