C++容器上的泛型操作

Generic operations on C++ containers

本文关键字:泛型 操作 C++      更新时间:2023-10-16

如何在C++STL容器上编写泛型操作?例如,Java有Collection接口,每个Java容器(除了映射)都实现该接口。无论实际容器是LinkedList、HashSet、ArrayBlockingQueue等,我都可以执行添加、删除、包含和迭代等操作。我觉得它非常强大。C++有迭代器,但是像add和remove这样的操作呢?向量有pushback,集合有insert,队列有push。如何以通用的方式向C++容器添加一些内容?

迭代:

所有标准容器都有iterators,它提供对容器元素的有序访问。这些也可以用于通用算法,这些算法适用于任何一致的迭代器类型。

插入:

所有序列和关联容器都可以通过表达式c.insert(i, x)将元素插入其中——其中c是序列或关联容器,ic的迭代器,x是要添加到c的值。

CCD_ 8和友元可以用于以通用方式向序列或关联容器添加元素。

删除:

对于任何序列或关联容器,以下代码有效:

while (true) {
    X::iterator it(std::find(c.begin(), c.end(), elem));
    if (it == c.end()) break;
    c.erase(it);
}

其中,X是容器的类型,c是容器对象,elem是具有要从容器中删除的值的对象。

对于序列,有一个擦除-删除习惯用法,看起来像:

c.erase(std::remove(c.begin(), c.end(), elem), c.end());

对于关联容器,您也可以执行以下操作:

c.erase(k);

其中k是与要擦除的元素相对应的密钥。

这是一个很好的界面:

参见助推范围

注意--这些是编译时可替换的,而java是运行时可替换。为了允许运行时替换,有必要使用类型擦除(也就是说,制作一个模板化的子类,将所需的接口转发到实例化它的容器)。

查看标题<algorithm>。有很多通用算法用于查找、排序、计数、复制等,这些算法适用于任何提供具有各种特定特性的迭代器的东西。

C++有std::inserter和朋友可以以通用的方式将元素添加到容器中。它们位于头文件iterator中。