如何在C ++ STL容器上编写泛型操作?例如,Java有Collection接口,每个Java容器(地图除外)都实现了该接口。无论实际容器是LinkedList,HashSet,ArrayBlockingQueue等,我都可以执行添加,删除,包含和迭代等操作。我发现它非常强大。 C ++有迭代器,但是添加和删除等操作呢? vector有push_back,set有insert,queue有push。如何以通用方式向C ++容器添加内容?
答案 0 :(得分:21)
<强>迭代:强>
所有标准容器都有iterators
,可以有序访问容器的元素。这些也可用于适用于任何符合迭代器类型的通用算法。
<强>插入:强>
所有序列和关联容器都可以通过表达式c.insert(i, x)
将元素插入其中 - 其中c
是序列或关联容器,i
是c
的迭代器}和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
中。