C++容器上的通用操作

ser*_*ega 12 c++ stl

如何在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是可运行时可替换的.为了允许运行时替换,必须使用类型擦除(即 - 创建一个模板化的子类,将所需的接口转发到它实例化的容器).

  • 但你写的"或关联容器"正是我想到的容器,你不能使用erase-remove. (3认同)

Ern*_*ill 9

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


Joh*_*nck 8

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