C ++容器上的通用操作

时间:2011-06-07 01:06:45

标签: c++ stl

如何在C ++ STL容器上编写泛型操作?例如,Java有Collection接口,每个Java容器(地图除外)都实现了该接口。无论实际容器是LinkedList,HashSet,ArrayBlockingQueue等,我都可以执行添加,删除,包含和迭代等操作。我发现它非常强大。 C ++有迭代器,但是添加和删除等操作呢? vector有push_back,set有insert,queue有push。如何以通用方式向C ++容器添加内容?

3 个答案:

答案 0 :(得分:21)

<强>迭代:

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

<强>插入:

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

std::inserter和朋友可以用于以通用方式向序列或关联容器添加元素。

<强>去除:

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

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是与要删除的元素对应的键。

所有这一切的良好界面:

请参阅Boost.Range

注意 - 这些是可编译的可编译时间,而java则是可替换的运行时。要允许运行时替换,必须使用类型擦除(即 - 创建一个模板化的子类,将所需的接口转发到它实例化的容器)。

答案 1 :(得分:9)

查看标题<algorithm>。有许多通用算法可用于查找,排序,计数,复制等,它们可以处理任何提供具有各种指定特征的迭代器。

答案 2 :(得分:8)

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