如何在C++ STL容器上编写泛型操作?例如,Java具有Collection接口,每个Java容器(地图除外)都实现了该接口.无论实际容器是LinkedList,HashSet,ArrayBlockingQueue等,我都可以执行添加,删除,包含和迭代等操作.我发现它非常强大.C++有迭代器,但是添加和删除等操作呢?vector有push_back,set有insert,queue有push.如何以通用方式向C++容器添加内容?
Man*_*rse 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);
}
Run Code Online (Sandbox Code Playgroud)
X容器的类型在哪里,c是容器对象,elem是一个具有要从容器中删除的值的对象.
对于序列,有擦除 - 删除习语,如下所示:
c.erase(std::remove(c.begin(), c.end(), elem), c.end());
Run Code Online (Sandbox Code Playgroud)
对于关联容器,您还可以:
c.erase(k);
Run Code Online (Sandbox Code Playgroud)
k与您要擦除的元素对应的键在哪里.
所有这一切的良好界面:
请参阅Boost.Range.
注意 - 这些是可编译的可编译时间,而java是可运行时可替换的.为了允许运行时替换,必须使用类型擦除(即 - 创建一个模板化的子类,将所需的接口转发到它实例化的容器).