C++ 容器上的通用操作
Posted
技术标签:
【中文标题】C++ 容器上的通用操作【英文标题】:Generic operations on C++ containers 【发布时间】:2011-06-07 01:06:44 【问题描述】:如何在 C++ STL 容器上编写通用操作?例如,Java 有Collection 接口,每个Java 容器(地图除外)都实现了该接口。无论实际容器是 LinkedList、HashSet、ArrayBlockingQueue 等,我都可以进行添加、删除、包含和迭代等操作。我觉得它非常强大。 C++ 有迭代器,但是像 add 和 remove 这样的操作呢? vector 有 push_back,set 有 insert,queue 有 push。如何以通用方式向 C++ 容器中添加内容?
【问题讨论】:
查看 C++ 标准的第 25 节,它包含 28 页各种算法,适用于各种容器。 【参考方案1】:迭代:
所有标准容器都有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 是运行时可替换的。为了允许运行时替换,必须使用类型擦除(即——创建一个模板化的子类,将所需的接口转发到实例化它的容器)。
【讨论】:
erase-remove 仅适用于 sequences,并非所有标准容器。 但是你写的“或关联容器”正是我想的那些你不能使用擦除删除的容器。【参考方案2】:查看标题<algorithm>
。那里有大量用于查找、排序、计数、复制等的通用算法,它们适用于任何提供具有各种指定特征的迭代器。
【讨论】:
【参考方案3】:C++ 有std::inserter
和朋友以通用方式向容器添加元素。它们在头文件iterator
中。
【讨论】:
以上是关于C++ 容器上的通用操作的主要内容,如果未能解决你的问题,请参考以下文章